* #31001: com.savoirfaire -> org.sflphone
diff --git a/src/org/sflphone/account/AccountDetail.java b/src/org/sflphone/account/AccountDetail.java
new file mode 100644
index 0000000..3678a0b
--- /dev/null
+++ b/src/org/sflphone/account/AccountDetail.java
@@ -0,0 +1,76 @@
+/**
+ * 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.
+ *  If you own a pjsip commercial license you can also redistribute it
+ *  and/or modify it under the terms of the GNU Lesser General Public License
+ *  as an android library.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public interface AccountDetail {
+
+    public static class PreferenceEntry {
+        public String mKey;
+        public int mLabelId;
+        public boolean isTwoState;
+        public String mValue;
+
+        public PreferenceEntry(String key, int labelId) {
+            mKey = key;
+            mLabelId = labelId;
+            isTwoState = false;
+            mValue = "";
+
+        }
+
+        public PreferenceEntry(String key, int labelId, boolean twoState) {
+            mKey = key;
+            mLabelId = labelId;
+            isTwoState = twoState;
+            mValue = "";
+        }
+
+        public PreferenceEntry(String key, int labelId, boolean twoState, String value) {
+            mKey = key;
+            mLabelId = labelId;
+            isTwoState = twoState;
+            mValue = value;
+        }
+
+        public boolean isChecked() {
+            if (mValue.contentEquals("true"))
+                return true;
+            return false;
+        }
+    }
+
+    public static final String TAG = "PreferenceHashMap";
+
+    public ArrayList<PreferenceEntry> getDetailValues();
+
+    public ArrayList<String> getValuesOnly();
+
+    public HashMap<String, String> getDetailsHashMap();
+
+    public String getDetailString(String key);
+
+    public void setDetailString(String key, String newValue);
+
+}
diff --git a/src/org/sflphone/account/AccountDetailAdvanced.java b/src/org/sflphone/account/AccountDetailAdvanced.java
new file mode 100644
index 0000000..e02c22e
--- /dev/null
+++ b/src/org/sflphone/account/AccountDetailAdvanced.java
@@ -0,0 +1,184 @@
+/**
+ * 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.
+ *  If you own a pjsip commercial license you can also redistribute it
+ *  and/or modify it under the terms of the GNU Lesser General Public License
+ *  as an android library.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import android.util.Log;
+
+import org.sflphone.R;
+
+public class AccountDetailAdvanced implements AccountDetail {
+
+    private static final String TAG = "AccountDetailAdvanced";
+    public static final String BUNDLE_TAG = "AdvancedPreferenceArrayList";
+
+    public static final String CONFIG_ACCOUNT_MAILBOX = "Account.mailbox";
+    public static final String CONFIG_ACCOUNT_REGISTRATION_EXPIRE = "Account.registrationExpire";
+    public static final String CONFIG_ACCOUNT_REGISTRATION_STATUS = "Account.registrationStatus";
+    public static final String CONFIG_ACCOUNT_REGISTRATION_STATE_CODE = "Account.registrationCode";
+    public static final String CONFIG_ACCOUNT_REGISTRATION_STATE_DESC = "Account.registrationDescription";
+    public static final String CONFIG_CREDENTIAL_NUMBER = "Credential.count";
+    public static final String CONFIG_ACCOUNT_DTMF_TYPE = "Account.dtmfType";
+    public static final String CONFIG_RINGTONE_PATH = "Account.ringtonePath";
+    public static final String CONFIG_RINGTONE_ENABLED = "Account.ringtoneEnabled";
+    public static final String CONFIG_KEEP_ALIVE_ENABLED = "Account.keepAliveEnabled";
+
+    public static final String CONFIG_ACCOUNT_AUTOANSWER = "Account.autoAnswer";
+    public static final String CONFIG_LOCAL_INTERFACE = "Account.localInterface";
+    public static final String CONFIG_PUBLISHED_SAMEAS_LOCAL = "Account.publishedSameAsLocal";
+    public static final String CONFIG_LOCAL_PORT = "Account.localPort";
+    public static final String CONFIG_PUBLISHED_PORT = "Account.publishedPort";
+    public static final String CONFIG_PUBLISHED_ADDRESS = "Account.publishedAddress";
+    
+
+    public static final String CONFIG_DEFAULT_LOCAL_PORT = "5060";
+    public static final String CONFIG_DEFAULT_PUBLISHED_PORT = "5060";
+    public static final String CONFIG_DEFAULT_PUBLISHED_SAMEAS_LOCAL = "true";
+
+    public static final String CONFIG_DEFAULT_INTERFACE = "default";
+    public static final String CONFIG_DEFAULT_REGISTRATION_EXPIRE = "60";
+
+    public static final String CONFIG_DISPLAY_NAME = "Account.displayName";
+    public static final String CONFIG_DEFAULT_ADDRESS = "0.0.0.0";
+
+    public static final String CONFIG_STUN_SERVER = "STUN.server";
+    public static final String CONFIG_STUN_ENABLE = "STUN.enable";
+    
+    public static final String CONFIG_DEFAULT_DTMF_TYPE = "overrtp";
+    
+    public static final String TRUE_STR = "true";
+    public static final String FALSE_STR = "false";
+
+    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_REGISTRATION_EXPIRE, R.string.account_registration_exp_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_REGISTRATION_STATUS, R.string.account_registration_status_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_REGISTRATION_STATE_CODE, R.string.account_registration_code_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_REGISTRATION_STATE_DESC, R.string.account_registration_state_label));
+        preference.add(new PreferenceEntry(CONFIG_CREDENTIAL_NUMBER, R.string.account_credential_count_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_DTMF_TYPE, R.string.account_config_dtmf_type_label));
+        preference.add(new PreferenceEntry(CONFIG_RINGTONE_PATH, R.string.account_ringtone_path_label));
+        preference.add(new PreferenceEntry(CONFIG_RINGTONE_ENABLED, R.string.account_ringtone_enabled_label, true));
+        preference.add(new PreferenceEntry(CONFIG_KEEP_ALIVE_ENABLED, R.string.account_keep_alive_label, true));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_AUTOANSWER, R.string.account_autoanswer_label, true));
+        preference.add(new PreferenceEntry(CONFIG_LOCAL_INTERFACE, R.string.account_local_interface_label));
+        preference.add(new PreferenceEntry(CONFIG_PUBLISHED_SAMEAS_LOCAL, R.string.account_published_same_as_local_label, true));
+        preference.add(new PreferenceEntry(CONFIG_LOCAL_PORT, R.string.account_local_port_label));
+        preference.add(new PreferenceEntry(CONFIG_PUBLISHED_PORT, R.string.account_published_port_label));
+        preference.add(new PreferenceEntry(CONFIG_PUBLISHED_ADDRESS, R.string.account_published_address_label));
+        preference.add(new PreferenceEntry(CONFIG_DISPLAY_NAME, R.string.account_displayname_label));
+        preference.add(new PreferenceEntry(CONFIG_STUN_SERVER, R.string.account_stun_server_label));
+        preference.add(new PreferenceEntry(CONFIG_STUN_ENABLE, R.string.account_stun_enable_label, true));
+
+        return preference;
+    }
+
+    public AccountDetailAdvanced()
+    {
+        privateArray = getPreferenceEntries();
+    }
+
+    public AccountDetailAdvanced(HashMap<String, String> pref)
+    {
+        privateArray = getPreferenceEntries();
+
+        for(AccountDetail.PreferenceEntry p : privateArray) {
+            p.mValue = pref.get(p.mKey);
+        }
+    }
+
+    public AccountDetailAdvanced(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;
+            }
+        }
+        
+    }
+
+}
diff --git a/src/org/sflphone/account/AccountDetailBasic.java b/src/org/sflphone/account/AccountDetailBasic.java
new file mode 100644
index 0000000..7b50220
--- /dev/null
+++ b/src/org/sflphone/account/AccountDetailBasic.java
@@ -0,0 +1,161 @@
+/**
+ * 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.
+ *  If you own a pjsip commercial license you can also redistribute it
+ *  and/or modify it under the terms of the GNU Lesser General Public License
+ *  as an android library.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import android.util.Log;
+
+import org.sflphone.R;
+
+public class AccountDetailBasic implements AccountDetail {
+
+    private static final String TAG = "AccountDetailBasic";
+    public static final String BUNDLE_TAG = "BasicPreferenceArrayList";
+
+    public static final String CONFIG_ACCOUNT_HOSTNAME = "Account.hostname";
+    public static final String CONFIG_ACCOUNT_USERNAME = "Account.username";
+    public static final String CONFIG_ACCOUNT_ROUTESET = "Account.routeset";
+    public static final String CONFIG_ACCOUNT_PASSWORD = "Account.password";
+    public static final String CONFIG_ACCOUNT_REALM = "Account.realm";
+    public static final String CONFIG_ACCOUNT_USERAGENT = "Account.useragent";
+    public static final String CONFIG_ACCOUNT_AUTOANSWER = "Account.autoAnswer";
+    public static final String CONFIG_ACCOUNT_TYPE = "Account.type";
+    public static final String CONFIG_ACCOUNT_ALIAS = "Account.alias";
+    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;
+
+    public static ArrayList<AccountDetail.PreferenceEntry> getPreferenceEntries()
+    {
+        ArrayList<AccountDetail.PreferenceEntry> preference = new ArrayList<AccountDetail.PreferenceEntry>();
+
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_ENABLE, R.string.account_enabled_label, true));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_TYPE, R.string.account_type_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_ALIAS, R.string.account_alias_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_HOSTNAME, R.string.account_hostname_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_USERNAME, R.string.account_username_label));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_ROUTESET, R.string.account_routeset_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));
+        preference.add(new PreferenceEntry(CONFIG_ACCOUNT_USERAGENT, R.string.account_autoanswer_label));
+
+        return preference;
+    }
+
+    public AccountDetailBasic()
+    {
+        privateArray = getPreferenceEntries();
+    }
+
+    public AccountDetailBasic(HashMap<String, String> pref)
+    {
+        privateArray = getPreferenceEntries();
+
+        for(AccountDetail.PreferenceEntry p : privateArray) {
+            p.mValue = pref.get(p.mKey);
+        }
+    }
+
+    public AccountDetailBasic(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) {
+                Log.i(TAG, "Creating "+privateArray.get(index).mKey+" value "+s);
+                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;
+            }
+        }
+        
+    }
+
+
+    public boolean getDetailBoolean()
+    {
+        return true;
+    }
+}
diff --git a/src/org/sflphone/account/AccountDetailSrtp.java b/src/org/sflphone/account/AccountDetailSrtp.java
new file mode 100644
index 0000000..c362097
--- /dev/null
+++ b/src/org/sflphone/account/AccountDetailSrtp.java
@@ -0,0 +1,150 @@
+/**
+ * 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.
+ *  If you own a pjsip commercial license you can also redistribute it
+ *  and/or modify it under the terms of the GNU Lesser General Public License
+ *  as an android library.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import android.util.Log;
+
+import org.sflphone.R;
+
+public class AccountDetailSrtp implements AccountDetail{
+
+    private static final String TAG = "AccountDetailSrtp";
+    public static final String BUNDLE_TAG = "SrtpPreferenceArrayList";
+    
+    public static final String CONFIG_SRTP_ENABLE = "SRTP.enable";
+    public static final String CONFIG_SRTP_KEY_EXCHANGE = "SRTP.keyExchange";
+    public static final String CONFIG_SRTP_ENCRYPTION_ALGO = "SRTP.encryptionAlgorithm";  // Provided by ccRTP,0=NULL,1=AESCM,2=AESF8
+    public static final String CONFIG_SRTP_RTP_FALLBACK = "SRTP.rtpFallback";
+    public static final String CONFIG_ZRTP_HELLO_HASH = "ZRTP.helloHashEnable";
+    public static final String CONFIG_ZRTP_DISPLAY_SAS = "ZRTP.displaySAS";
+    public static final String CONFIG_ZRTP_NOT_SUPP_WARNING = "ZRTP.notSuppWarning";
+    public static final String CONFIG_ZRTP_DISPLAY_SAS_ONCE = "ZRTP.displaySasOnce";
+
+    private ArrayList<AccountDetail.PreferenceEntry> privateArray;
+
+    public static ArrayList<AccountDetail.PreferenceEntry> getPreferenceEntries()
+    {
+        ArrayList<AccountDetail.PreferenceEntry> preference = new ArrayList<AccountDetail.PreferenceEntry>();
+
+        preference.add(new PreferenceEntry(CONFIG_SRTP_ENABLE, R.string.account_srtp_enabled_label, true));
+        preference.add(new PreferenceEntry(CONFIG_SRTP_KEY_EXCHANGE, R.string.account_srtp_exchange_label, true));
+        preference.add(new PreferenceEntry(CONFIG_SRTP_ENCRYPTION_ALGO, R.string.account_encryption_algo_label, true));
+        preference.add(new PreferenceEntry(CONFIG_SRTP_RTP_FALLBACK, R.string.account_srtp_fallback_label, true));
+        preference.add(new PreferenceEntry(CONFIG_ZRTP_HELLO_HASH, R.string.account_hello_hash_enable_label, true));
+        preference.add(new PreferenceEntry(CONFIG_ZRTP_DISPLAY_SAS, R.string.account_display_sas_label, true));
+        preference.add(new PreferenceEntry(CONFIG_ZRTP_NOT_SUPP_WARNING, R.string.account_not_supported_warning_label, true));
+        preference.add(new PreferenceEntry(CONFIG_ZRTP_DISPLAY_SAS_ONCE, R.string.account_display_sas_once_label, true));
+
+        return preference; 
+    }
+
+    public AccountDetailSrtp()
+    {
+        privateArray = getPreferenceEntries();
+    }
+
+    public AccountDetailSrtp(HashMap<String, String> pref)
+    {
+        privateArray = getPreferenceEntries();
+
+        for(AccountDetail.PreferenceEntry p : privateArray) {
+            p.mValue = pref.get(p.mKey);
+        }
+    }
+
+    public AccountDetailSrtp(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) {
+            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;
+            }
+        }
+        
+    }
+
+
+    public boolean getDetailBoolean()
+    {
+        return true;
+    }
+}
diff --git a/src/org/sflphone/account/AccountDetailTls.java b/src/org/sflphone/account/AccountDetailTls.java
new file mode 100644
index 0000000..7a13c08
--- /dev/null
+++ b/src/org/sflphone/account/AccountDetailTls.java
@@ -0,0 +1,161 @@
+/**
+ * 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.
+ *  If you own a pjsip commercial license you can also redistribute it
+ *  and/or modify it under the terms of the GNU Lesser General Public License
+ *  as an android library.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import android.util.Log;
+
+import org.sflphone.R;
+
+public class AccountDetailTls implements AccountDetail {
+
+    private static final String TAG = "AccountDetailTls";
+    public static final String BUNDLE_TAG = "TlsPreferenceArrayList";
+    
+    public static final String CONFIG_TLS_LISTENER_PORT = "TLS.listenerPort";
+    public static final String CONFIG_TLS_ENABLE = "TLS.enable";
+    public static final String CONFIG_TLS_CA_LIST_FILE = "TLS.certificateListFile";
+    public static final String CONFIG_TLS_CERTIFICATE_FILE = "TLS.certificateFile";
+    public static final String CONFIG_TLS_PRIVATE_KEY_FILE = "TLS.privateKeyFile";
+    public static final String CONFIG_TLS_PASSWORD = "TLS.password";
+    public static final String CONFIG_TLS_METHOD = "TLS.method";
+    public static final String CONFIG_TLS_CIPHERS = "TLS.ciphers";
+    public static final String CONFIG_TLS_SERVER_NAME = "TLS.serverName";
+    public static final String CONFIG_TLS_VERIFY_SERVER = "TLS.verifyServer";
+    public static final String CONFIG_TLS_VERIFY_CLIENT = "TLS.verifyClient";
+    public static final String CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE = "TLS.requireClientCertificate";
+    public static final String CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC = "TLS.negotiationTimeoutSec";
+    public static final String CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC = "TLS.negotiationTimemoutMsec";
+ 
+    private ArrayList<AccountDetail.PreferenceEntry> privateArray;
+
+    public static ArrayList<AccountDetail.PreferenceEntry> getPreferenceEntries()
+    {
+        ArrayList<AccountDetail.PreferenceEntry> preference = new ArrayList<AccountDetail.PreferenceEntry>();
+
+        preference.add(new PreferenceEntry(CONFIG_TLS_LISTENER_PORT, R.string.account_listener_port_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_ENABLE, R.string.account_tls_enabled_label, true));
+        preference.add(new PreferenceEntry(CONFIG_TLS_CA_LIST_FILE, R.string.account_tls_certificate_list_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_CERTIFICATE_FILE, R.string.account_tls_certificate_file_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_PRIVATE_KEY_FILE, R.string.account_tls_private_key_file_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_PASSWORD, R.string.account_tls_password_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_METHOD, R.string.account_tls_method_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_CIPHERS, R.string.account_tls_ciphers_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_SERVER_NAME, R.string.account_tls_server_name_label));
+        preference.add(new PreferenceEntry(CONFIG_TLS_VERIFY_SERVER, R.string.account_tls_verify_label, true));
+        preference.add(new PreferenceEntry(CONFIG_TLS_VERIFY_CLIENT, R.string.account_tls_verify_client_label, true));
+        preference.add(new PreferenceEntry(CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, R.string.account_tls_require_client_certificat_label, true));
+        preference.add(new PreferenceEntry(CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, R.string.account_tls_negotiation_timeout_sec));
+        preference.add(new PreferenceEntry(CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC, R.string.account_tls_negotiation_timeout_msec));
+
+        return preference;
+    }
+
+    public AccountDetailTls()
+    {
+        privateArray = getPreferenceEntries();
+    }
+
+    public AccountDetailTls(HashMap<String, String> pref)
+    {
+        privateArray = getPreferenceEntries();
+
+        for(AccountDetail.PreferenceEntry p : privateArray) {
+            p.mValue = pref.get(p.mKey);
+        }
+    }
+
+    public AccountDetailTls(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) {
+            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;
+            }
+        }
+        
+    }
+
+    public boolean getDetailBoolean()
+    {
+        return true;
+    }
+}
diff --git a/src/org/sflphone/account/AccountDetailsHandler.java b/src/org/sflphone/account/AccountDetailsHandler.java
new file mode 100644
index 0000000..2dcff63
--- /dev/null
+++ b/src/org/sflphone/account/AccountDetailsHandler.java
@@ -0,0 +1,246 @@
+/**
+ * Copyright (C) 2004-2013 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.
+ *  If you own a pjsip commercial license you can also redistribute it
+ *  and/or modify it under the terms of the GNU Lesser General Public License
+ *  as an android library.
+ *
+ *  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, see <http://www.gnu.org/licenses/>.
+ */
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.sflphone.R;
+import org.sflphone.service.StringMap;
+
+public class AccountDetailsHandler {
+//    private static final String TAG = "AccountDetailsHandler";
+
+    public static class PreferenceEntry {
+        public String mKey;
+        public int mLabelId;
+
+        public PreferenceEntry(String key, int labelId) {
+            mKey = key;
+            mLabelId = labelId;
+        }
+    }
+
+    public static ArrayList<PreferenceEntry> getBasicDetailsKeys() {
+        ArrayList<PreferenceEntry> basicDetailKeys = new ArrayList<PreferenceEntry>();
+
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_TYPE, R.string.account_type_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS, R.string.account_alias_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE, R.string.account_enabled_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME, R.string.account_hostname_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, R.string.account_username_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_ROUTESET, R.string.account_routeset_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, R.string.account_password_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_REALM, R.string.account_realm_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_DEFAULT_REALM, R.string.account_useragent_label));
+        basicDetailKeys.add(new PreferenceEntry(AccountDetailBasic.CONFIG_ACCOUNT_USERAGENT, R.string.account_autoanswer_label));
+
+        return basicDetailKeys;
+    }
+
+    public static ArrayList<PreferenceEntry> getAdvancedDetailsKeys() {
+        ArrayList<PreferenceEntry> advancedDetailKeys = new ArrayList<PreferenceEntry>();
+
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_EXPIRE, R.string.account_registration_exp_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATUS, R.string.account_registration_status_label));
+        advancedDetailKeys
+                .add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_CODE, R.string.account_registration_code_label));
+        advancedDetailKeys
+                .add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_DESC, R.string.account_registration_state_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_CREDENTIAL_NUMBER, R.string.account_credential_count_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_ACCOUNT_DTMF_TYPE, R.string.account_config_dtmf_type_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_RINGTONE_PATH, R.string.account_ringtone_path_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_RINGTONE_ENABLED, R.string.account_ringtone_enabled_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_KEEP_ALIVE_ENABLED, R.string.account_keep_alive_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_ACCOUNT_AUTOANSWER, R.string.account_autoanswer_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE, R.string.account_local_interface_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_PUBLISHED_SAMEAS_LOCAL, R.string.account_published_same_as_local_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_LOCAL_PORT, R.string.account_local_port_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_PUBLISHED_PORT, R.string.account_published_port_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_PUBLISHED_ADDRESS, R.string.account_published_address_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_DISPLAY_NAME, R.string.account_displayname_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_STUN_SERVER, R.string.account_stun_server_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailAdvanced.CONFIG_STUN_ENABLE, R.string.account_stun_enable_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_SRTP_ENABLE, R.string.account_srtp_enabled_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_SRTP_KEY_EXCHANGE, R.string.account_srtp_exchange_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_SRTP_ENCRYPTION_ALGO, R.string.account_encryption_algo_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_SRTP_RTP_FALLBACK, R.string.account_srtp_fallback_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_ZRTP_HELLO_HASH, R.string.account_hello_hash_enable_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS, R.string.account_display_sas_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_ZRTP_NOT_SUPP_WARNING, R.string.account_not_supported_warning_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS_ONCE, R.string.account_display_sas_once_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_LISTENER_PORT, R.string.account_listener_port_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_ENABLE, R.string.account_tls_enabled_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_CA_LIST_FILE, R.string.account_tls_certificate_list_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_CERTIFICATE_FILE, R.string.account_tls_certificate_file_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_PRIVATE_KEY_FILE, R.string.account_tls_private_key_file_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_PASSWORD, R.string.account_tls_password_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_METHOD, R.string.account_tls_method_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_CIPHERS, R.string.account_tls_ciphers_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_SERVER_NAME, R.string.account_tls_server_name_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_VERIFY_SERVER, R.string.account_tls_verify_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_VERIFY_CLIENT, R.string.account_tls_verify_client_label));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE,
+                R.string.account_tls_require_client_certificat_label));
+        advancedDetailKeys
+                .add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, R.string.account_tls_negotiation_timeout_sec));
+        advancedDetailKeys.add(new PreferenceEntry(AccountDetailTls.CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC,
+                R.string.account_tls_negotiation_timeout_msec));
+
+        return advancedDetailKeys;
+    }
+
+    public static StringMap convertFromNativeToSwig(HashMap<String, String> nativemap) {
+        StringMap swigmap = new StringMap();
+
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_ROUTESET, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_ROUTESET));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_TYPE, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_TYPE));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE));
+        swigmap.set(AccountDetailBasic.CONFIG_ACCOUNT_USERAGENT, nativemap.get(AccountDetailBasic.CONFIG_ACCOUNT_USERAGENT));
+        
+        
+        swigmap.set(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_EXPIRE, nativemap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_EXPIRE));
+        swigmap.set(AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE, nativemap.get(AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE));
+        swigmap.set(AccountDetailAdvanced.CONFIG_STUN_SERVER, nativemap.get(AccountDetailAdvanced.CONFIG_STUN_SERVER));
+        
+        // swigmap.set(ServiceConstants.CONFIG_ACCOUNT_MAILBOX, nativemap.get(ServiceConstants.CONFIG_ACCOUNT_MAILBOX));
+        
+        swigmap.set(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATUS, nativemap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATUS));
+        swigmap.set(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_CODE, nativemap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_CODE));
+        swigmap.set(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_DESC, nativemap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_DESC));
+        swigmap.set(AccountDetailAdvanced.CONFIG_ACCOUNT_AUTOANSWER, nativemap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_AUTOANSWER));
+        
+        swigmap.set(AccountDetailAdvanced.CONFIG_ACCOUNT_DTMF_TYPE, nativemap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_DTMF_TYPE));
+        swigmap.set(AccountDetailAdvanced.CONFIG_KEEP_ALIVE_ENABLED, nativemap.get(AccountDetailAdvanced.CONFIG_KEEP_ALIVE_ENABLED));
+        swigmap.set(AccountDetailAdvanced.CONFIG_LOCAL_PORT, nativemap.get(AccountDetailAdvanced.CONFIG_LOCAL_PORT));
+        swigmap.set(AccountDetailAdvanced.CONFIG_PUBLISHED_ADDRESS, nativemap.get(AccountDetailAdvanced.CONFIG_PUBLISHED_ADDRESS));
+        swigmap.set(AccountDetailAdvanced.CONFIG_PUBLISHED_PORT, nativemap.get(AccountDetailAdvanced.CONFIG_PUBLISHED_PORT));
+        swigmap.set(AccountDetailAdvanced.CONFIG_PUBLISHED_SAMEAS_LOCAL, nativemap.get(AccountDetailAdvanced.CONFIG_PUBLISHED_SAMEAS_LOCAL));
+        swigmap.set(AccountDetailAdvanced.CONFIG_RINGTONE_ENABLED, nativemap.get(AccountDetailAdvanced.CONFIG_RINGTONE_ENABLED));
+        swigmap.set(AccountDetailAdvanced.CONFIG_RINGTONE_PATH, nativemap.get(AccountDetailAdvanced.CONFIG_RINGTONE_PATH));
+        swigmap.set(AccountDetailAdvanced.CONFIG_STUN_ENABLE, nativemap.get(AccountDetailAdvanced.CONFIG_STUN_ENABLE));
+
+        
+        swigmap.set(AccountDetailSrtp.CONFIG_SRTP_KEY_EXCHANGE, nativemap.get(AccountDetailSrtp.CONFIG_SRTP_KEY_EXCHANGE));
+        swigmap.set(AccountDetailSrtp.CONFIG_SRTP_RTP_FALLBACK, nativemap.get(AccountDetailSrtp.CONFIG_SRTP_RTP_FALLBACK));
+        swigmap.set(AccountDetailSrtp.CONFIG_SRTP_ENABLE, nativemap.get(AccountDetailSrtp.CONFIG_SRTP_ENABLE));
+        swigmap.set(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS, nativemap.get(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS));
+        swigmap.set(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS_ONCE, nativemap.get(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS_ONCE));
+        swigmap.set(AccountDetailSrtp.CONFIG_ZRTP_HELLO_HASH, nativemap.get(AccountDetailSrtp.CONFIG_ZRTP_HELLO_HASH));
+        swigmap.set(AccountDetailSrtp.CONFIG_ZRTP_NOT_SUPP_WARNING, nativemap.get(AccountDetailSrtp.CONFIG_ZRTP_NOT_SUPP_WARNING));
+
+        swigmap.set(AccountDetailTls.CONFIG_TLS_CIPHERS, nativemap.get(AccountDetailTls.CONFIG_TLS_CIPHERS));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_LISTENER_PORT, nativemap.get(AccountDetailTls.CONFIG_TLS_LISTENER_PORT));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_METHOD, nativemap.get(AccountDetailTls.CONFIG_TLS_METHOD));
+        // swigmap.set(ServiceConstants.CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC, nativemap.get(ServiceConstants.CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC));
+        // swigmap.set(ServiceConstants.CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, nativemap.get(ServiceConstants.CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_ENABLE, nativemap.get(AccountDetailTls.CONFIG_TLS_ENABLE));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_PASSWORD, nativemap.get(AccountDetailTls.CONFIG_TLS_PASSWORD));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_PRIVATE_KEY_FILE, nativemap.get(AccountDetailTls.CONFIG_TLS_PRIVATE_KEY_FILE));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, nativemap.get(AccountDetailTls.CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_SERVER_NAME, nativemap.get(AccountDetailTls.CONFIG_TLS_SERVER_NAME));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_VERIFY_CLIENT, nativemap.get(AccountDetailTls.CONFIG_TLS_VERIFY_CLIENT));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_CERTIFICATE_FILE, nativemap.get(AccountDetailTls.CONFIG_TLS_CERTIFICATE_FILE));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_CA_LIST_FILE, nativemap.get(AccountDetailTls.CONFIG_TLS_CA_LIST_FILE));
+        swigmap.set(AccountDetailTls.CONFIG_TLS_VERIFY_SERVER, nativemap.get(AccountDetailTls.CONFIG_TLS_VERIFY_SERVER));
+        
+
+        return swigmap;
+    }
+
+    public static HashMap<String, String> convertSwigToNative(StringMap swigmap) {
+
+        HashMap<String, String> nativemap = new HashMap<String, String>();
+
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_ALIAS));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_HOSTNAME));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_USERNAME));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_PASSWORD));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_ROUTESET, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_ROUTESET));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_TYPE, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_TYPE));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_ENABLE));
+        nativemap.put(AccountDetailBasic.CONFIG_ACCOUNT_USERAGENT, swigmap.get(AccountDetailBasic.CONFIG_ACCOUNT_USERAGENT));
+
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_EXPIRE, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_EXPIRE));
+        nativemap.put(AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE, swigmap.get(AccountDetailAdvanced.CONFIG_LOCAL_INTERFACE));
+        nativemap.put(AccountDetailAdvanced.CONFIG_STUN_SERVER, swigmap.get(AccountDetailAdvanced.CONFIG_STUN_SERVER));
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_MAILBOX, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_MAILBOX));
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATUS, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATUS));
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_CODE, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_CODE));
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_DESC, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_REGISTRATION_STATE_DESC));
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_AUTOANSWER, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_AUTOANSWER));
+        nativemap.put(AccountDetailAdvanced.CONFIG_ACCOUNT_DTMF_TYPE, swigmap.get(AccountDetailAdvanced.CONFIG_ACCOUNT_DTMF_TYPE));
+        nativemap.put(AccountDetailAdvanced.CONFIG_KEEP_ALIVE_ENABLED, swigmap.get(AccountDetailAdvanced.CONFIG_KEEP_ALIVE_ENABLED));
+        nativemap.put(AccountDetailAdvanced.CONFIG_LOCAL_PORT, swigmap.get(AccountDetailAdvanced.CONFIG_LOCAL_PORT));
+        nativemap.put(AccountDetailAdvanced.CONFIG_PUBLISHED_ADDRESS, swigmap.get(AccountDetailAdvanced.CONFIG_PUBLISHED_ADDRESS));
+        nativemap.put(AccountDetailAdvanced.CONFIG_PUBLISHED_PORT, swigmap.get(AccountDetailAdvanced.CONFIG_PUBLISHED_PORT));
+        nativemap.put(AccountDetailAdvanced.CONFIG_PUBLISHED_SAMEAS_LOCAL, swigmap.get(AccountDetailAdvanced.CONFIG_PUBLISHED_SAMEAS_LOCAL));
+        nativemap.put(AccountDetailAdvanced.CONFIG_RINGTONE_ENABLED, swigmap.get(AccountDetailAdvanced.CONFIG_RINGTONE_ENABLED));
+        nativemap.put(AccountDetailAdvanced.CONFIG_RINGTONE_PATH, swigmap.get(AccountDetailAdvanced.CONFIG_RINGTONE_PATH));
+        nativemap.put(AccountDetailAdvanced.CONFIG_STUN_ENABLE, swigmap.get(AccountDetailAdvanced.CONFIG_STUN_ENABLE));
+        
+        
+        nativemap.put(AccountDetailSrtp.CONFIG_SRTP_KEY_EXCHANGE, swigmap.get(AccountDetailSrtp.CONFIG_SRTP_KEY_EXCHANGE));
+        nativemap.put(AccountDetailSrtp.CONFIG_SRTP_RTP_FALLBACK, swigmap.get(AccountDetailSrtp.CONFIG_SRTP_RTP_FALLBACK));
+        nativemap.put(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS, swigmap.get(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS));
+        nativemap.put(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS_ONCE, swigmap.get(AccountDetailSrtp.CONFIG_ZRTP_DISPLAY_SAS_ONCE));
+        nativemap.put(AccountDetailSrtp.CONFIG_ZRTP_HELLO_HASH, swigmap.get(AccountDetailSrtp.CONFIG_ZRTP_HELLO_HASH));
+        nativemap.put(AccountDetailSrtp.CONFIG_ZRTP_NOT_SUPP_WARNING, swigmap.get(AccountDetailSrtp.CONFIG_ZRTP_NOT_SUPP_WARNING));
+        nativemap.put(AccountDetailSrtp.CONFIG_SRTP_ENABLE, swigmap.get(AccountDetailSrtp.CONFIG_SRTP_ENABLE));
+
+        nativemap.put(AccountDetailTls.CONFIG_TLS_CIPHERS, swigmap.get(AccountDetailTls.CONFIG_TLS_CIPHERS));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_LISTENER_PORT, swigmap.get(AccountDetailTls.CONFIG_TLS_LISTENER_PORT));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_METHOD, swigmap.get(AccountDetailTls.CONFIG_TLS_METHOD));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC, swigmap.get(AccountDetailTls.CONFIG_TLS_NEGOTIATION_TIMEOUT_MSEC));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC, swigmap.get(AccountDetailTls.CONFIG_TLS_NEGOTIATION_TIMEOUT_SEC));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_PASSWORD, swigmap.get(AccountDetailTls.CONFIG_TLS_PASSWORD));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_PRIVATE_KEY_FILE, swigmap.get(AccountDetailTls.CONFIG_TLS_PRIVATE_KEY_FILE));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE, swigmap.get(AccountDetailTls.CONFIG_TLS_REQUIRE_CLIENT_CERTIFICATE));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_SERVER_NAME, swigmap.get(AccountDetailTls.CONFIG_TLS_SERVER_NAME));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_VERIFY_CLIENT, swigmap.get(AccountDetailTls.CONFIG_TLS_VERIFY_CLIENT));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_VERIFY_SERVER, swigmap.get(AccountDetailTls.CONFIG_TLS_VERIFY_SERVER));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_CERTIFICATE_FILE, swigmap.get(AccountDetailTls.CONFIG_TLS_CERTIFICATE_FILE));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_CA_LIST_FILE, swigmap.get(AccountDetailTls.CONFIG_TLS_CA_LIST_FILE));
+        nativemap.put(AccountDetailTls.CONFIG_TLS_ENABLE, swigmap.get(AccountDetailTls.CONFIG_TLS_ENABLE));
+        
+        /*
+         * nativemap.put(ServiceConstants.CONFIG_CREDENTIAL_NUMBER, swigmap.get(ServiceConstants.CONFIG_CREDENTIAL_NUMBER));
+         * nativemap.put(ServiceConstants.CONFIG_ACCOUNT_PASSWORD, swigmap.get(ServiceConstants.CONFIG_ACCOUNT_PASSWORD));
+         * nativemap.put(ServiceConstants.CONFIG_ACCOUNT_REALM, swigmap.get(ServiceConstants.CONFIG_ACCOUNT_REALM));
+         */
+
+        /*
+         * nativemap.put(ServiceConstants.CONFIG_ACCOUNT_DEFAULT_REALM, swigmap.get(ServiceConstants.CONFIG_ACCOUNT_DEFAULT_REALM));
+         * nativemap.put(ServiceConstants.CONFIG_INTERFACE, swigmap.get(ServiceConstants.CONFIG_INTERFACE));
+         * nativemap.put(ServiceConstants.CONFIG_DEFAULT_INTERFACE, swigmap.get(ServiceConstants.CONFIG_DEFAULT_INTERFACE));
+         * nativemap.put(ServiceConstants.CONFIG_DISPLAY_NAME, swigmap.get(ServiceConstants.CONFIG_DISPLAY_NAME));
+         * nativemap.put(ServiceConstants.CONFIG_DEFAULT_ADDRESS, swigmap.get(ServiceConstants.CONFIG_DEFAULT_ADDRESS));
+         * nativemap.put(ServiceConstants.CONFIG_SRTP_ENCRYPTION_ALGO, swigmap.get(ServiceConstants.CONFIG_SRTP_ENCRYPTION_ALGO));
+         */
+
+        return nativemap;
+    }
+};
diff --git a/src/org/sflphone/account/AudioHandler.java b/src/org/sflphone/account/AudioHandler.java
new file mode 100644
index 0000000..b05a6bd
--- /dev/null
+++ b/src/org/sflphone/account/AudioHandler.java
@@ -0,0 +1,28 @@
+package org.sflphone.account;
+
+import java.util.ArrayList;
+
+import org.sflphone.service.IntVect;
+
+import android.util.Log;
+
+public class AudioHandler {
+
+    private static final String TAG = AudioHandler.class.getSimpleName();
+
+    public static ArrayList<Integer> convertSwigToNative(IntVect swigmap) {
+
+        ArrayList<Integer> nativemap = new ArrayList<Integer>();
+
+        Log.w(TAG, "size codecs list " + swigmap.size());
+
+        for (int i = 0; i < swigmap.size(); ++i) {
+
+            Integer t = swigmap.get(i);
+            nativemap.add(t);
+        }
+
+        return nativemap;
+    }
+
+}
diff --git a/src/org/sflphone/account/CallDetailsHandler.java b/src/org/sflphone/account/CallDetailsHandler.java
new file mode 100644
index 0000000..a950ea2
--- /dev/null
+++ b/src/org/sflphone/account/CallDetailsHandler.java
@@ -0,0 +1,78 @@
+/*
+ *  Copyright (C) 2004-2013 Savoir-Faire Linux Inc.
+ *
+ *  Author: Alexandre Lision <alexandre.lision@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 org.sflphone.account;
+
+import java.util.HashMap;
+
+import org.sflphone.service.ServiceConstants;
+import org.sflphone.service.StringMap;
+
+import android.util.Log;
+
+public class CallDetailsHandler {
+    
+       private static String TAG = CallDetailsHandler.class.getSimpleName();
+
+    public static HashMap<String, String> convertSwigToNative(StringMap swigmap) {
+
+        HashMap<String, String> entry = new HashMap<String, String>();
+
+        Log.i(TAG, "CALL_TYPE: " + tryToGet(swigmap, ServiceConstants.call.CALL_TYPE));
+        Log.i(TAG, "PEER_NUMBER: " + tryToGet(swigmap, ServiceConstants.call.PEER_NUMBER));
+        Log.i(TAG, "DISPLAY_NAME: " + tryToGet(swigmap, ServiceConstants.call.DISPLAY_NAME));
+        Log.i(TAG, "CALL_STATE: " + tryToGet(swigmap, ServiceConstants.call.CALL_STATE));
+        Log.i(TAG, "CONF_ID" + tryToGet(swigmap, ServiceConstants.call.CONF_ID));
+        Log.i(TAG, "TIMESTAMP_START: " + tryToGet(swigmap, ServiceConstants.call.TIMESTAMP_START));
+        Log.i(TAG, "ACCOUNTID: " + tryToGet(swigmap, ServiceConstants.call.ACCOUNTID));
+        
+        entry.put(ServiceConstants.call.CALL_TYPE, tryToGet(swigmap, ServiceConstants.call.CALL_TYPE));
+        entry.put(ServiceConstants.call.PEER_NUMBER, tryToGet(swigmap, ServiceConstants.call.PEER_NUMBER));
+        entry.put(ServiceConstants.call.DISPLAY_NAME, tryToGet(swigmap, ServiceConstants.call.DISPLAY_NAME));
+        entry.put(ServiceConstants.call.CALL_STATE, tryToGet(swigmap, ServiceConstants.call.CALL_STATE));
+        entry.put(ServiceConstants.call.CONF_ID, tryToGet(swigmap, ServiceConstants.call.CONF_ID));
+        entry.put(ServiceConstants.call.TIMESTAMP_START, tryToGet(swigmap, ServiceConstants.call.TIMESTAMP_START));
+        entry.put(ServiceConstants.call.ACCOUNTID, tryToGet(swigmap, ServiceConstants.call.ACCOUNTID));
+
+        return entry;
+    }
+    
+    private static String tryToGet(StringMap smap, String key) {
+        if (smap.has_key(key)) {
+            return smap.get(key);
+        } else {
+            if(key.contentEquals(ServiceConstants.call.TIMESTAMP_START))
+            return ""+System.currentTimeMillis() / 1000;
+            return "";
+        }
+    }
+
+}
diff --git a/src/org/sflphone/account/HistoryHandler.java b/src/org/sflphone/account/HistoryHandler.java
new file mode 100644
index 0000000..3427c74
--- /dev/null
+++ b/src/org/sflphone/account/HistoryHandler.java
@@ -0,0 +1,46 @@
+package org.sflphone.account;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+import org.sflphone.service.ServiceConstants;
+import org.sflphone.service.StringMap;
+import org.sflphone.service.VectMap;
+
+public class HistoryHandler {
+//    private static final String TAG = HistoryHandler.class.getSimpleName();
+
+    private static String tryToGet(StringMap smap, String key) {
+        if (smap.has_key(key)) {
+            return smap.get(key);
+        } else {
+            return "";
+        }
+    }
+
+    public static ArrayList<HashMap<String, String>> convertSwigToNative(VectMap swigmap) {
+
+        ArrayList<HashMap<String, String>> nativemap = new ArrayList<HashMap<String, String>>();
+
+//        Log.w(TAG, "size history " + swigmap.size());
+
+        for (int i = 0; i < swigmap.size(); ++i) {
+            HashMap<String, String> entry = new HashMap<String, String>();
+
+            entry.put(ServiceConstants.history.ACCOUNT_ID_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.ACCOUNT_ID_KEY));
+            entry.put(ServiceConstants.history.CALLID_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.CALLID_KEY));
+            entry.put(ServiceConstants.history.CONFID_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.CONFID_KEY));
+            entry.put(ServiceConstants.history.DISPLAY_NAME_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.DISPLAY_NAME_KEY));
+            entry.put(ServiceConstants.history.PEER_NUMBER_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.PEER_NUMBER_KEY));
+            entry.put(ServiceConstants.history.RECORDING_PATH_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.RECORDING_PATH_KEY));
+            entry.put(ServiceConstants.history.STATE_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.STATE_KEY));
+            entry.put(ServiceConstants.history.TIMESTAMP_START_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.TIMESTAMP_START_KEY));
+            entry.put(ServiceConstants.history.TIMESTAMP_STOP_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.TIMESTAMP_STOP_KEY));
+            entry.put(ServiceConstants.history.AUDIO_CODEC_KEY, tryToGet(swigmap.get(i), ServiceConstants.history.AUDIO_CODEC_KEY));
+
+            nativemap.add(entry);
+        }
+
+        return nativemap;
+    }
+}