diff --git a/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java b/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
index 9a788e1..b35ca40 100644
--- a/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
+++ b/src/com/savoirfairelinux/sflphone/client/AccountCreationActivity.java
@@ -44,6 +44,7 @@
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceManager;
 import android.preference.EditTextPreference;
+import android.preference.CheckBoxPreference;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
@@ -52,6 +53,7 @@
 import com.savoirfairelinux.sflphone.R;
 import com.savoirfairelinux.sflphone.service.SipService;
 import com.savoirfairelinux.sflphone.service.ISipService;
+import com.savoirfairelinux.sflphone.utils.AccountDetail;
 import com.savoirfairelinux.sflphone.utils.AccountDetailsHandler;
 import com.savoirfairelinux.sflphone.utils.AccountDetailBasic;
 import com.savoirfairelinux.sflphone.utils.AccountDetailAdvanced;
@@ -76,13 +78,22 @@
 
     Preference.OnPreferenceChangeListener changeNewAccountPreferenceListener = new Preference.OnPreferenceChangeListener() {
         public boolean onPreferenceChange(Preference preference, Object newValue) {
-            
-            ((EditTextPreference)preference).setText(((CharSequence) newValue).toString());
-            preference.setSummary(getString(R.string.account_current_value_label) + (CharSequence)newValue);
             return true;
         }
     };
 
+    Preference.OnPreferenceChangeListener changeNewAccountTwoStateListener = new Preference.OnPreferenceChangeListener() {
+        public boolean onPreferenceChange(Preference preference, Object newValue) {
+            if(((CheckBoxPreference)preference).isChecked()) {
+                preference.setSummary(getString(R.string.account_current_value_label) + "enabled");
+            }
+            else {
+                preference.setSummary(getString(R.string.account_current_value_label) + "disabled");
+            }
+            return true;
+        } 
+    };
+
     private ServiceConnection mConnection = new ServiceConnection() {
         @Override
         public void onServiceConnected(ComponentName className, IBinder binder) {
@@ -150,45 +161,27 @@
         return true;
     }
 
+    private void addPreferenceListener(AccountDetail details) {
+        for(AccountDetail.PreferenceEntry p : details.getDetailValues()) {
+            Preference pref = mPreferenceManager.findPreference(p.mKey);
+            if(pref != null) {
+                Log.i(TAG, "FOUND " + p.mKey);
+                if(!p.isTwoState) {
+                    pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
+                }
+            }
+        }
+    }
+
     @Override
     protected void onStart() {
         super.onStart();
 
-        // AlertDialog dialog = createAlertDialog();
-        // dialog.show();
-
-        for(String s : basicDetails.getDetailKeys()) {
-            EditTextPreference pref = (EditTextPreference) mPreferenceManager.findPreference(s);
-            if(pref != null) {
-                Log.i(TAG, "FOUND " + s);
-                pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
-            }
-        }
-
-        for(String s : advancedDetails.getDetailKeys()) {
-            EditTextPreference pref = (EditTextPreference) mPreferenceManager.findPreference(s);
-            if(pref != null) {
-                Log.i(TAG, "FOUND " + s);
-                pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
-            }
-        }
-
-        for(String s : srtpDetails.getDetailKeys()) {
-            EditTextPreference pref = (EditTextPreference) mPreferenceManager.findPreference(s);
-            if(pref != null) {
-                Log.i(TAG, "FOUND " + s);
-                pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
-            }
-        }
-
-        for(String s : tlsDetails.getDetailKeys()) {
-            EditTextPreference pref = (EditTextPreference) mPreferenceManager.findPreference(s);
-            if(pref != null) {
-                Log.i(TAG, "FOUND " + s);
-                pref.setOnPreferenceChangeListener(changeNewAccountPreferenceListener);
-            }
-        }
-
+        addPreferenceListener(basicDetails);
+        addPreferenceListener(advancedDetails);
+        addPreferenceListener(srtpDetails);
+        addPreferenceListener(tlsDetails);
+ 
         if(!mBound) {
             Log.i(TAG, "onStart: Binding service...");
             Intent intent = new Intent(this, SipService.class);
