diff --git a/src/org/sflphone/account/AccountCredentials.java b/src/org/sflphone/account/AccountCredentials.java
new file mode 100644
index 0000000..baeb12f
--- /dev/null
+++ b/src/org/sflphone/account/AccountCredentials.java
@@ -0,0 +1,104 @@
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.sflphone.R;
+
+import android.util.Log;
+
+public class AccountCredentials implements AccountDetail {
+
+    private static final String TAG = AccountCredentials.class.getSimpleName();
+
+    public static final String CONFIG_ACCOUNT_USERNAME = "Account.username";
+    public static final String CONFIG_ACCOUNT_PASSWORD = "Account.password";
+    public static final String CONFIG_ACCOUNT_REALM = "Account.realm";
+    
+
+    private ArrayList<AccountDetail.PreferenceEntry> privateArray;
+
+    public static ArrayList<AccountDetail.PreferenceEntry> getPreferenceEntries() {
+        ArrayList<AccountDetail.PreferenceEntry> preference = new ArrayList<AccountDetail.PreferenceEntry>();
+
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_USERNAME, R.string.account_username_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_PASSWORD, R.string.account_password_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_REALM, R.string.account_realm_label));
+
+        return preference;
+    }
+
+    public AccountCredentials() {
+        privateArray = getPreferenceEntries();
+    }
+
+    public AccountCredentials(HashMap<String, String> pref) {
+        privateArray = getPreferenceEntries();
+
+        for (AccountDetail.PreferenceEntry p : privateArray) {
+            p.mValue = pref.get(p.mKey);
+        }
+    }
+
+    public AccountCredentials(ArrayList<String> pref) {
+        privateArray = getPreferenceEntries();
+
+        if (pref.size() != privateArray.size()) {
+            Log.i(TAG, "Error list are not of equal size");
+        } else {
+            int index = 0;
+            for (String s : pref) {
+                privateArray.get(index).mValue = s;
+                index++;
+            }
+        }
+    }
+
+    public ArrayList<AccountDetail.PreferenceEntry> getDetailValues() {
+        return privateArray;
+    }
+
+    public ArrayList<String> getValuesOnly() {
+        ArrayList<String> valueList = new ArrayList<String>();
+
+        for (AccountDetail.PreferenceEntry p : privateArray) {
+            Log.i(TAG, "" + p.mValue);
+            valueList.add(p.mValue);
+        }
+
+        return valueList;
+    }
+
+    public HashMap<String, String> getDetailsHashMap() {
+        HashMap<String, String> map = new HashMap<String, String>();
+
+        for (AccountDetail.PreferenceEntry p : privateArray) {
+            map.put(p.mKey, p.mValue);
+        }
+
+        return map;
+    }
+
+    public String getDetailString(String key) {
+        String value = "";
+
+        for (AccountDetail.PreferenceEntry p : privateArray) {
+            if (p.mKey.equals(key)) {
+                value = p.mValue;
+                return value;
+            }
+        }
+        return value;
+    }
+
+    public void setDetailString(String key, String newValue) {
+        for (int i = 0; i < privateArray.size(); ++i) {
+            PreferenceEntry p = privateArray.get(i);
+            if (p.mKey.equals(key)) {
+                privateArray.get(i).mValue = newValue;
+            }
+        }
+
+    }
+
+}
\ No newline at end of file
diff --git a/src/org/sflphone/account/AccountDetailBasic.java b/src/org/sflphone/account/AccountDetailBasic.java
index 6b312bc..66ea886 100644
--- a/src/org/sflphone/account/AccountDetailBasic.java
+++ b/src/org/sflphone/account/AccountDetailBasic.java
@@ -45,10 +45,7 @@
     public static final String CONFIG_ACCOUNT_TYPE = "Account.type";
     public static final String CONFIG_ACCOUNT_ENABLE = "Account.enable";
 
-    public static final String CONFIG_ACCOUNT_DEFAULT_TYPE = "SIP";
-    public static final String CONFIG_ACCOUNT_DEFAULT_ENABLE = "true";
-    public static final String CONFIG_ACCOUNT_DEFAULT_REALM = "*";
-    public static final String CONFIG_ACCOUNT_DEFAULT_USERAGENT = "SFLphone";
+
 
     private ArrayList<AccountDetail.PreferenceEntry> privateArray;
 
diff --git a/src/org/sflphone/account/AccountDetailsHandler.java b/src/org/sflphone/account/AccountDetailsHandler.java
index b16022c..e3a43d5 100644
--- a/src/org/sflphone/account/AccountDetailsHandler.java
+++ b/src/org/sflphone/account/AccountDetailsHandler.java
@@ -24,9 +24,11 @@
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 
 import org.sflphone.R;
 import org.sflphone.service.StringMap;
+import org.sflphone.service.VectMap;
 
 public class AccountDetailsHandler {
     // private static final String TAG = "AccountDetailsHandler";
@@ -243,4 +245,34 @@
 
         return nativemap;
     }
+
+    public static ArrayList<HashMap<String, String>> convertCredentialsToNative(VectMap map) {
+        
+        ArrayList<HashMap<String, String>> toReturn = new ArrayList<HashMap<String,String>>();
+        StringMap entry;
+        HashMap<String, String> nativeEntry = new HashMap<String, String>();
+        for(int i = 0 ; i < map.size() ; ++i){
+            entry = map.get(i);
+            nativeEntry.put(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, entry.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
+            nativeEntry.put(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, entry.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
+            nativeEntry.put(AccountDetailBasic.CONFIG_ACCOUNT_REALM, entry.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM));
+            toReturn.add(nativeEntry);
+        }
+        return toReturn;
+    }
+
+    public static VectMap convertCredentialsToSwig(List creds) {
+        ArrayList<HashMap<String, String>> todecode = (ArrayList<HashMap<String, String>>) creds;
+        VectMap toReturn = new VectMap();
+        StringMap entry = new StringMap();
+        HashMap<String, String> nativeEntry;
+        for(int i = 0 ; i < todecode.size() ; ++i){
+            nativeEntry = todecode.get(i);
+            entry.set(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, nativeEntry.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
+            entry.set(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, nativeEntry.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
+            entry.set(AccountDetailBasic.CONFIG_ACCOUNT_REALM, nativeEntry.get(AccountDetailBasic.CONFIG_ACCOUNT_REALM));
+            toReturn.add(entry);
+        }
+        return toReturn;
+    }
 };
diff --git a/src/org/sflphone/client/AccountEditionActivity.java b/src/org/sflphone/client/AccountEditionActivity.java
index a84d127..b083f4b 100644
--- a/src/org/sflphone/client/AccountEditionActivity.java
+++ b/src/org/sflphone/client/AccountEditionActivity.java
@@ -69,6 +69,7 @@
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
+import android.view.View;
 
 public class AccountEditionActivity extends Activity implements TabListener, GeneralAccountFragment.Callbacks, AudioManagementFragment.Callbacks,
         AdvancedAccountFragment.Callbacks, SecurityAccountFragment.Callbacks, NestedSettingsFragment.Callbacks {
@@ -78,6 +79,8 @@
     private boolean mBound = false;
     private ISipService service;
 
+    private View mOverlayContainer;
+
     private Account acc_selected;
 
     PreferencesPagerAdapter mPreferencesPagerAdapter;
@@ -140,6 +143,7 @@
             }
         });
 
+        mOverlayContainer = findViewById(R.id.hidden_container);
         acc_selected = getIntent().getExtras().getParcelable("account");
 
         if (!mBound) {
@@ -401,4 +405,13 @@
         return acc_selected;
     }
 
+    @Override
+    public void displayCredentialsScreen() {
+        Fragment toDisplay = new NestedSettingsFragment();
+        Bundle b = new Bundle();
+        b.putInt("MODE", 0);
+        toDisplay.setArguments(b);
+        getFragmentManager().beginTransaction().replace(R.id.hidden_container, toDisplay).commit();
+    }
+
 }
diff --git a/src/org/sflphone/client/CallActivity.java b/src/org/sflphone/client/CallActivity.java
index a4781b4..e237277 100644
--- a/src/org/sflphone/client/CallActivity.java
+++ b/src/org/sflphone/client/CallActivity.java
@@ -105,7 +105,7 @@
         slidingPaneLayout = (CallPaneLayout) findViewById(R.id.slidingpanelayout);
         slidingPaneLayout.setParallaxDistance(500);
         slidingPaneLayout.setSliderFadeColor(Color.TRANSPARENT);
-        
+
         slidingPaneLayout.setPanelSlideListener(new SlidingPaneLayout.PanelSlideListener() {
 
             @Override
@@ -207,7 +207,9 @@
                     service.destroyNotification();
 
                     String accountID = (String) service.getAccountList().get(1); // We use the first account to place outgoing calls
-                    Account acc = new Account(accountID, (HashMap<String, String>) service.getAccountDetails(accountID));
+                    HashMap<String, String> details = (HashMap<String, String>) service.getAccountDetails(accountID);
+                    ArrayList<HashMap<String, String>> credentials = (ArrayList<HashMap<String, String>>) service.getCredentials(accountID);
+                    Account acc = new Account(accountID, details, credentials);
 
                     SipCall call = SipCall.SipCallBuilder.getInstance().startCallCreation().setContact(c).setAccount(acc)
                             .setCallType(SipCall.state.CALL_TYPE_OUTGOING).build();
@@ -235,7 +237,7 @@
 
                 } else {
                     mCurrentCallFragment.setArguments(getIntent().getExtras());
-                    
+
                     Bundle IMBundle = new Bundle();
                     IMBundle.putParcelableArrayList("messages", new ArrayList<SipMessage>());
                     mIMFragment.setArguments(IMBundle);
@@ -350,15 +352,15 @@
         mHandler.removeCallbacks(mUpdateTimeTask);
         mCurrentCallFragment.getBubbleView().stopThread();
         TimerTask quit = new TimerTask() {
-            
+
             @Override
             public void run() {
                 finish();
             }
         };
-        
+
         new Timer().schedule(quit, 2000);
-        
+
     }
 
     @Override
diff --git a/src/org/sflphone/fragments/NestedSettingsFragment.java b/src/org/sflphone/fragments/NestedSettingsFragment.java
index 6a27c6e..c418e41 100644
--- a/src/org/sflphone/fragments/NestedSettingsFragment.java
+++ b/src/org/sflphone/fragments/NestedSettingsFragment.java
@@ -6,6 +6,7 @@
 import java.util.Enumeration;
 
 import org.sflphone.R;
+import org.sflphone.account.AccountCredentials;
 import org.sflphone.account.AccountDetail;
 import org.sflphone.account.AccountDetailAdvanced;
 import org.sflphone.model.Account;
@@ -18,6 +19,9 @@
 import android.preference.Preference.OnPreferenceChangeListener;
 import android.preference.PreferenceFragment;
 import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
 
 public class NestedSettingsFragment extends PreferenceFragment {
 
@@ -48,7 +52,7 @@
             throw new IllegalStateException("Activity must implement fragment's callbacks.");
         }
 
-        Log.e(TAG,"Attaching Adavnced");
+        Log.e(TAG, "Attaching Adavnced");
         mCallbacks = (Callbacks) activity;
     }
 
@@ -63,11 +67,41 @@
         super.onCreate(savedInstanceState);
 
         // Load the preferences from an XML resource
-//        addPreferencesFromResource(R.xml.account_advanced_prefs);
-//        setPreferenceDetails(mCallbacks.getAccount().getAdvancedDetails());
-//        addPreferenceListener(mCallbacks.getAccount().getAdvancedDetails(), changeAdvancedPreferenceListener);
-        
-        
+        switch (getArguments().getInt("MODE")) {
+        case 0:
+
+            addPreferencesFromResource(R.xml.account_credentials);
+            addAllCredentials();
+            break;
+        case 1:
+            break;
+        case 2:
+            break;
+        }
+
+        // setPreferenceDetails(mCallbacks.getAccount().getAdvancedDetails());
+        // addPreferenceListener(mCallbacks.getAccount().getAdvancedDetails(), changeAdvancedPreferenceListener);
+
+    }
+
+    private void addAllCredentials() {
+
+        ArrayList<AccountCredentials> credentials = mCallbacks.getAccount().getCredentials();
+        for (AccountCredentials cred : credentials) {
+            Preference toAdd = new Preference(getActivity());
+            toAdd.setTitle(cred.getDetailString(AccountCredentials.CONFIG_ACCOUNT_USERNAME));
+            toAdd.setSummary(cred.getDetailString(AccountCredentials.CONFIG_ACCOUNT_PASSWORD));
+            getPreferenceScreen().addPreference(toAdd);
+        }
+
+    }
+
+    @Override
+    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+        View view = super.onCreateView(inflater, container, savedInstanceState);
+        view.setBackgroundColor(getResources().getColor(android.R.color.white));
+
+        return view;
     }
 
     private void setPreferenceDetails(AccountDetail details) {
@@ -125,15 +159,14 @@
         public boolean onPreferenceChange(Preference preference, Object newValue) {
             setDifferent(true);
             if (preference instanceof CheckBoxPreference) {
-                     mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
-                     if(preference.getKey().contentEquals("STUN.enable")){
-                         findPreference("STUN.server").setEnabled((Boolean) newValue);
-                     } else if (preference.getKey().contentEquals("Account.publishedSameAsLocal")){
-                         findPreference("Account.publishedPort").setEnabled((Boolean) newValue);
-                         findPreference("Account.publishedAddress").setEnabled((Boolean) newValue);
-                     }
-                    
-                    
+                mCallbacks.getAccount().getAdvancedDetails().setDetailString(preference.getKey(), ((Boolean) newValue).toString());
+                if (preference.getKey().contentEquals("STUN.enable")) {
+                    findPreference("STUN.server").setEnabled((Boolean) newValue);
+                } else if (preference.getKey().contentEquals("Account.publishedSameAsLocal")) {
+                    findPreference("Account.publishedPort").setEnabled((Boolean) newValue);
+                    findPreference("Account.publishedAddress").setEnabled((Boolean) newValue);
+                }
+
             } else {
                 preference.setSummary((CharSequence) newValue);
                 Log.i(TAG, "Changing preference value:" + newValue);
diff --git a/src/org/sflphone/fragments/SecurityAccountFragment.java b/src/org/sflphone/fragments/SecurityAccountFragment.java
index 020edc0..51c6cb3 100644
--- a/src/org/sflphone/fragments/SecurityAccountFragment.java
+++ b/src/org/sflphone/fragments/SecurityAccountFragment.java
@@ -7,9 +7,9 @@
 import android.app.Activity;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
-import android.preference.EditTextPreference;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceChangeListener;
+import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceFragment;
 import android.util.Log;
 
@@ -18,7 +18,6 @@
     private static final String TAG = SecurityAccountFragment.class.getSimpleName();
 
     private boolean isDifferent = false;
-
     private Callbacks mCallbacks = sDummyCallbacks;
     private static Callbacks sDummyCallbacks = new Callbacks() {
 
@@ -27,12 +26,18 @@
             return null;
         }
 
+        @Override
+        public void displayCredentialsScreen() {
+        }
+
     };
 
     public interface Callbacks {
 
         public Account getAccount();
 
+        public void displayCredentialsScreen();
+
     }
 
     @Override
@@ -57,26 +62,36 @@
 
         // Load the preferences from an XML resource
         addPreferencesFromResource(R.xml.account_security_prefs);
-//        setPreferenceDetails(mCallbacks.getAccount().getTlsDetails());
-//        setPreferenceDetails(mCallbacks.getAccount().getSrtpDetails());
-//        addPreferenceListener(mCallbacks.getAccount().getTlsDetails(), changeTlsPreferenceListener);
-//        addPreferenceListener(mCallbacks.getAccount().getSrtpDetails(), changeSrtpPreferenceListener);
+        setPreferenceDetails(mCallbacks.getAccount().getTlsDetails());
+        // setPreferenceDetails(mCallbacks.getAccount().getSrtpDetails());
+        // addPreferenceListener(mCallbacks.getAccount().getTlsDetails(), changeTlsPreferenceListener);
+        // addPreferenceListener(mCallbacks.getAccount().getSrtpDetails(), changeSrtpPreferenceListener);
 
     }
 
     private void setPreferenceDetails(AccountDetail details) {
-        for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
-            Log.i(TAG, "setPreferenceDetails: pref " + p.mKey + " value " + p.mValue);
-            Preference pref = findPreference(p.mKey);
-            if (pref != null) {
-                if (!p.isTwoState) {
-                    ((EditTextPreference) pref).setText(p.mValue);
-                    pref.setSummary(p.mValue);
-                }
-            } else {
-                Log.w(TAG, "pref not found");
+
+        findPreference("Credential.count").setOnPreferenceClickListener(new OnPreferenceClickListener() {
+
+            @Override
+            public boolean onPreferenceClick(Preference preference) {
+                mCallbacks.displayCredentialsScreen();
+                return false;
             }
-        }
+        });
+
+        // for (AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+        // Log.i(TAG, "setPreferenceDetails: pref " + p.mKey + " value " + p.mValue);
+        // Preference pref = findPreference(p.mKey);
+        // if (pref != null) {
+        // if (!p.isTwoState) {
+        // ((EditTextPreference) pref).setText(p.mValue);
+        // pref.setSummary(p.mValue);
+        // }
+        // } else {
+        // Log.w(TAG, "pref not found");
+        // }
+        // }
     }
 
     private void addPreferenceListener(AccountDetail details, OnPreferenceChangeListener listener) {
diff --git a/src/org/sflphone/loaders/AccountsLoader.java b/src/org/sflphone/loaders/AccountsLoader.java
index e4bf4ce..e5b85e3 100644
--- a/src/org/sflphone/loaders/AccountsLoader.java
+++ b/src/org/sflphone/loaders/AccountsLoader.java
@@ -35,15 +35,17 @@
         try {
             ArrayList<String> accountIDs = (ArrayList<String>) service.getAccountList();
             HashMap<String, String> details;
+            ArrayList<HashMap<String, String>> credentials;
             for (String id : accountIDs) {
 
                 if (id.contentEquals(ACCOUNT_IP2IP)) {
                     details = (HashMap<String, String>) service.getAccountDetails(id);
-                    IP2IP = new Account(ACCOUNT_IP2IP, details);
+                    IP2IP = new Account(ACCOUNT_IP2IP, details, new ArrayList<HashMap<String, String>>()); // Empty credentials
                     continue;
                 }
                 details = (HashMap<String, String>) service.getAccountDetails(id);
-                Account tmp = new Account(id, details);
+                credentials = (ArrayList<HashMap<String, String>>) service.getCredentials(id);
+                Account tmp = new Account(id, details, credentials);
 
                 accounts.add(tmp);
 
@@ -55,7 +57,7 @@
         } catch (NullPointerException e1) {
             Log.e(TAG, e1.toString());
         }
-        
+
         Bundle result = new Bundle();
         result.putParcelableArrayList(ACCOUNTS, accounts);
         result.putParcelable(ACCOUNT_IP2IP, IP2IP);
diff --git a/src/org/sflphone/model/Account.java b/src/org/sflphone/model/Account.java
index 0a41479..5f1a93a 100644
--- a/src/org/sflphone/model/Account.java
+++ b/src/org/sflphone/model/Account.java
@@ -31,8 +31,10 @@
 
 package org.sflphone.model;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 
+import org.sflphone.account.AccountCredentials;
 import org.sflphone.account.AccountDetailAdvanced;
 import org.sflphone.account.AccountDetailBasic;
 import org.sflphone.account.AccountDetailSrtp;
@@ -48,13 +50,18 @@
     private AccountDetailAdvanced advancedDetails = null;
     private AccountDetailSrtp srtpDetails = null;
     private AccountDetailTls tlsDetails = null;
+    private ArrayList<AccountCredentials> credentialsDetails;
 
-    public Account(String bAccountID, HashMap<String, String> details) {
+    public Account(String bAccountID, HashMap<String, String> details, ArrayList<HashMap<String, String>> credentials) {
         accountID = bAccountID;
         basicDetails = new AccountDetailBasic(details);
         advancedDetails = new AccountDetailAdvanced(details);
         srtpDetails = new AccountDetailSrtp(details);
         tlsDetails = new AccountDetailTls(details);
+        credentialsDetails = new ArrayList<AccountCredentials>();
+        for (int i = 0; i < credentials.size(); ++i) {
+            credentialsDetails.add(new AccountCredentials(credentials.get(i)));
+        }
     }
 
     public String getAccountID() {
@@ -106,6 +113,10 @@
         dest.writeSerializable(advancedDetails.getDetailsHashMap());
         dest.writeSerializable(tlsDetails.getDetailsHashMap());
         dest.writeSerializable(srtpDetails.getDetailsHashMap());
+        dest.writeInt(credentialsDetails.size());
+        for (AccountCredentials cred : credentialsDetails) {
+            dest.writeSerializable(cred.getDetailsHashMap());
+        }
     }
 
     private void readFromParcel(Parcel in) {
@@ -115,6 +126,11 @@
         advancedDetails = new AccountDetailAdvanced((HashMap<String, String>) in.readSerializable());
         srtpDetails = new AccountDetailSrtp((HashMap<String, String>) in.readSerializable());
         tlsDetails = new AccountDetailTls((HashMap<String, String>) in.readSerializable());
+        credentialsDetails = new ArrayList<AccountCredentials>();
+        int cred_count = in.readInt();
+        for (int i = 0; i < cred_count; ++i) {
+            credentialsDetails.add(new AccountCredentials((HashMap<String, String>) in.readSerializable()));
+        }
     }
 
     public static final Parcelable.Creator<Account> CREATOR = new Parcelable.Creator<Account>() {
@@ -162,8 +178,7 @@
     }
 
     public boolean isEnabled() {
-        return (basicDetails.getDetailString(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE)
-                .contentEquals(AccountDetailBasic.CONFIG_ACCOUNT_DEFAULT_ENABLE));
+        return (basicDetails.getDetailString(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE).contentEquals("true"));
     }
 
     public void setEnabled(boolean isChecked) {
@@ -194,4 +209,8 @@
         return basicDetails.getDetailString(AccountDetailBasic.CONFIG_ACCOUNT_AUTOANSWER).contentEquals("true");
     }
 
+    public ArrayList<AccountCredentials> getCredentials() {
+        return credentialsDetails;
+    }
+
 }
diff --git a/src/org/sflphone/receivers/IncomingReceiver.java b/src/org/sflphone/receivers/IncomingReceiver.java
index 077be7c..6c9b8d2 100644
--- a/src/org/sflphone/receivers/IncomingReceiver.java
+++ b/src/org/sflphone/receivers/IncomingReceiver.java
@@ -12,6 +12,7 @@
 import org.sflphone.model.SipMessage;
 import org.sflphone.service.CallManagerCallBack;
 import org.sflphone.service.ConfigurationManagerCallback;
+import org.sflphone.service.ISipService.Stub;
 import org.sflphone.service.ServiceConstants;
 import org.sflphone.service.SipService;
 
@@ -21,10 +22,6 @@
 import android.os.Bundle;
 import android.os.RemoteException;
 import android.util.Log;
-import android.widget.Toast;
-
-import org.sflphone.service.ISipService.Stub;
-import org.sflphone.service.ServiceConstants.call;
 
 public class IncomingReceiver extends BroadcastReceiver {
 
@@ -59,12 +56,11 @@
             Log.i(TAG, "Received" + intent.getAction());
             if (callback.getCurrent_calls().get(extra.getString("CallID")) != null) {
                 callback.getCurrent_calls().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
-            } else if(callback.getCurrent_confs().get(extra.getString("CallID")) != null){
+            } else if (callback.getCurrent_confs().get(extra.getString("CallID")) != null) {
                 callback.getCurrent_confs().get(extra.get("CallID")).addSipMessage(new SipMessage(true, extra.getString("Msg")));
-            } else 
+            } else
                 return;
-                
-           
+
             callback.sendBroadcast(intent);
 
         } else if (intent.getAction().contentEquals(CallManagerCallBack.INCOMING_CALL)) {
@@ -74,7 +70,10 @@
 
             Account acc;
             try {
-                acc = new Account(b.getString("AccountID"), (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID")));
+                HashMap<String, String> details = (HashMap<String, String>) mBinder.getAccountDetails(b.getString("AccountID"));
+                ArrayList<HashMap<String, String>> credentials = (ArrayList<HashMap<String, String>>) mBinder
+                        .getCredentials(b.getString("AccountID"));
+                acc = new Account(b.getString("AccountID"), details, credentials);
                 callBuilder.startCallCreation(b.getString("CallID")).setAccount(acc).setCallState(SipCall.state.CALL_STATE_RINGING)
                         .setCallType(SipCall.state.CALL_TYPE_INCOMING);
                 callBuilder.setContact(CallContact.ContactBuilder.buildUnknownContact(b.getString("From")));
@@ -83,11 +82,11 @@
 
                 SipCall newCall = callBuilder.build();
                 toSend.putExtra("newcall", newCall);
-                HashMap<String, String> details = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
-                newCall.setTimestamp_start(Long.parseLong(details.get(ServiceConstants.call.TIMESTAMP_START)));
+                HashMap<String, String> callDetails = (HashMap<String, String>) mBinder.getCallDetails(b.getString("CallID"));
+                newCall.setTimestamp_start(Long.parseLong(callDetails.get(ServiceConstants.call.TIMESTAMP_START)));
                 callback.getCurrent_calls().put(newCall.getCallId(), newCall);
                 callback.sendBroadcast(toSend);
-                
+
                 callback.mediaManager.obtainAudioFocus();
             } catch (RemoteException e1) {
                 e1.printStackTrace();
@@ -116,7 +115,7 @@
                     callback.getCurrent_calls().get(b.getString("CallID")).setCallState(SipCall.state.CALL_STATE_RINGING);
                 } catch (NullPointerException e) {
                     if (callback.getCurrent_calls() == null) {
-                        
+
                         return;
                     }
                     if (callback.getCurrent_calls().get(b.getString("CallID")) == null) {
@@ -270,27 +269,27 @@
 
             Log.i(TAG, "Received" + intent.getAction());
 
-//            try {
-//                if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
-//                    callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-//                } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
-//                    callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-//                } else {
-//                    // A call in a conference has been put on hold
-//                    Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
-//                    while (it.hasNext()) {
-//                        Conference c = it.next();
-//                        if (c.getCall(intent.getStringExtra("id")) != null)
-//                            c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
-//                    }
-//                }
-//                // Re sending the same intent to the app
-//                callback.sendBroadcast(intent);
-//                ;
-//            } catch (RemoteException e) {
-//                // TODO Auto-generated catch block
-//                e.printStackTrace();
-//            }
+            // try {
+            // if (callback.getCurrent_confs().get(intent.getStringExtra("id")) != null) {
+            // callback.getCurrent_confs().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+            // } else if (callback.getCurrent_calls().get(intent.getStringExtra("id")) != null) {
+            // callback.getCurrent_calls().get(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+            // } else {
+            // // A call in a conference has been put on hold
+            // Iterator<Conference> it = callback.getCurrent_confs().values().iterator();
+            // while (it.hasNext()) {
+            // Conference c = it.next();
+            // if (c.getCall(intent.getStringExtra("id")) != null)
+            // c.getCall(intent.getStringExtra("id")).setRecording(mBinder.isRecording(intent.getStringExtra("id")));
+            // }
+            // }
+            // // Re sending the same intent to the app
+            // callback.sendBroadcast(intent);
+            // ;
+            // } catch (RemoteException e) {
+            // // TODO Auto-generated catch block
+            // e.printStackTrace();
+            // }
 
         }
 
diff --git a/src/org/sflphone/service/ISipService.aidl b/src/org/sflphone/service/ISipService.aidl
index 4a965d2..a953acf 100644
--- a/src/org/sflphone/service/ISipService.aidl
+++ b/src/org/sflphone/service/ISipService.aidl
@@ -21,6 +21,8 @@
     Map getAccountDetails(in String accountID);
     Map getAccountTemplate();
     void setAccountDetails(in String accountId, in Map accountDetails);
+    List getCredentials(in String accountID);
+    void setCredentials(in String accountID, in List creds);
     void setAudioPlugin(in String callID);
     String getCurrentAudioOutputPlugin();
     List getAudioCodecList(in String accountID);
diff --git a/src/org/sflphone/service/SipService.java b/src/org/sflphone/service/SipService.java
index 998e37f..9fe9f5b 100644
--- a/src/org/sflphone/service/SipService.java
+++ b/src/org/sflphone/service/SipService.java
@@ -550,7 +550,6 @@
         public void setAccountDetails(final String accountId, final Map map) {
             HashMap<String, String> nativemap = (HashMap<String, String>) map;
 
-            Log.e(TAG,"CONFIG_ACCOUNT_REGISTRATION_EXPIRE:"+map.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_EXPIRE));
             final StringMap swigmap = AccountDetailsHandler.convertFromNativeToSwig(nativemap);
 
             getExecutor().execute(new SipRunnable() {
@@ -1301,6 +1300,37 @@
             return (Boolean) runInstance.getVal();
         }
 
+        @Override
+        public List getCredentials(final String accountID) throws RemoteException {
+            class Credentials extends SipRunnableWithReturn {
+
+                @Override
+                protected List doRun() throws SameThreadException {
+                    Log.i(TAG, "SipService.getCredentials() thread running...");
+                    VectMap map = configurationManagerJNI.getCredentials(accountID);
+                    ArrayList<HashMap<String, String>> result = AccountDetailsHandler.convertCredentialsToNative(map);
+                    return result;
+                }
+            }
+
+            Credentials runInstance = new Credentials();
+            getExecutor().execute(runInstance);
+            while (!runInstance.isDone()) {
+            }
+            return (List) runInstance.getVal();
+        }
+
+        @Override
+        public void setCredentials(final String accountID, final List creds) throws RemoteException {
+            getExecutor().execute(new SipRunnable() {
+                @Override
+                protected void doRun() throws SameThreadException, RemoteException {
+                    Log.i(TAG, "SipService.setCredentials() thread running...");
+                    configurationManagerJNI.setCredentials(accountID, AccountDetailsHandler.convertCredentialsToSwig(creds));;
+                }
+            });
+        }
+
        
 
     };
