diff --git a/res/values/strings.xml b/res/values/strings.xml
index f3928ed..06bb9f3 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1280,8 +1280,6 @@
     <!-- Title of the sip editor screen. [CHAR LIMIT=NONE] -->
     <string name="sip_edit_new_title">Edit new SIP account</string>
 
-    <!-- Initial status of the preferences is '<Not set>'. [CHAR LIMIT=NONE] -->
-    <string name="initial_preference_summary">&lt;Not set&gt;</string>
     <!-- Text of the sip profile name preference. [CHAR LIMIT=NONE] -->
     <string name="profile_name_title">Name</string>
     <!-- Text of the domain address preference. [CHAR LIMIT=NONE] -->
@@ -1292,16 +1290,12 @@
     <string name="password_title">Password</string>
     <!-- Text of the display name preference. [CHAR LIMIT=NONE] -->
     <string name="display_name_title">Display name</string>
-    <!-- Text of the default display name preference summary. [CHAR LIMIT=NONE] -->
-    <string name="display_name_summary">&lt;Same as username&gt;</string>
     <!-- Text of the outbound proxy address preference. [CHAR LIMIT=NONE] -->
-    <string name="proxy_address_title">Outbound Proxy address</string>
+    <string name="proxy_address_title">Outbound proxy address</string>
     <!-- Text of the sip server/proxy port number. [CHAR LIMIT=NONE] -->
-    <string name="port_title">Port Number</string>
-    <!-- Text of the default sip server/proxy port number. [CHAR LIMIT=NONE] -->
-    <string name="port_summary">5060</string>
+    <string name="port_title">Port number</string>
     <!-- Text of the transport type preference. [CHAR LIMIT=NONE] -->
-    <string name="transport_title">Transport Type</string>
+    <string name="transport_title">Transport type</string>
     <!-- Text of the keepalive preference. [CHAR LIMIT=NONE] -->
     <string name="send_keepalive_title">Send keep-alive</string>
     <!-- Text of the keepalive preference summary. [CHAR LIMIT=NONE] -->
@@ -1317,6 +1311,17 @@
     <!-- Text of the advanced settings section. [CHAR LIMIT=NONE] -->
     <string name="advanced_settings">Optional settings</string>
 
+    <!-- Initial status of the preferences is '<Not set>'. [CHAR LIMIT=NONE] -->
+    <string name="default_preference_summary">&lt;Not set&gt;</string>
+    <!-- Default value for the display-name preference summary. [CHAR LIMIT=NONE] -->
+    <string name="display_name_summary">&lt;Same as username&gt;</string>
+    <!-- Default value for the outbound-proxy-address preference summary. [CHAR LIMIT=NONE] -->
+    <string name="optional_summary">&lt;Optional&gt;</string>
+    <!-- Default sip server/proxy port number. [CHAR LIMIT=NONE] -->
+    <string name="default_port">5060</string>
+    <!-- Default sip server/proxy transport protocol. [CHAR LIMIT=NONE] -->
+    <string name="default_transport">UDP</string>
+
     <!-- Hint to show the advanced settings section. [CHAR LIMIT=NONE] -->
     <string name="advanced_settings_show">▷ Select to show all</string>
     <!-- Hint to hide the advanced settings section. [CHAR LIMIT=NONE] -->
diff --git a/res/xml/sip_advanced_edit.xml b/res/xml/sip_advanced_edit.xml
index 81ae359..e068339 100644
--- a/res/xml/sip_advanced_edit.xml
+++ b/res/xml/sip_advanced_edit.xml
@@ -25,6 +25,7 @@
             android:key="@string/display_name"
             android:title="@string/display_name_title"
             android:dialogTitle="@string/display_name_title"
+            android:summary="@string/display_name_summary"
             android:persistent="false"
             android:singleLine="true"/>
 
@@ -32,14 +33,16 @@
             android:key="@string/proxy_address"
             android:title="@string/proxy_address_title"
             android:dialogTitle="@string/proxy_address_title"
+            android:summary="@string/optional_summary"
+            android:defaultValue=""
             android:persistent="false"
             android:singleLine="true"/>
 
         <EditTextPreference
             android:key="@string/port"
             android:title="@string/port_title"
-            android:defaultValue="@string/port_summary"
-            android:summary="@string/port_summary"
+            android:defaultValue="@string/default_port"
+            android:summary="@string/default_port"
             android:dialogTitle="@string/port_title"
             android:persistent="false"
             android:singleLine="true"/>
@@ -49,6 +52,7 @@
             android:title="@string/transport_title"
             android:entries="@array/transport_types"
             android:entryValues="@array/transport_types"
+            android:summary="@string/default_transport"
             android:persistent="false"
             android:dialogTitle="@string/transport_title"/>
 
diff --git a/res/xml/sip_edit.xml b/res/xml/sip_edit.xml
index 0e76c5a..6ecc6a9 100644
--- a/res/xml/sip_edit.xml
+++ b/res/xml/sip_edit.xml
@@ -22,6 +22,8 @@
         android:key="@string/profile_name"
         android:title="@string/profile_name_title"
         android:dialogTitle="@string/profile_name_title"
+        android:defaultValue=""
+        android:summary="@string/default_preference_summary"
         android:persistent="false"
         android:singleLine="true"/>
 
@@ -29,6 +31,8 @@
         android:key="@string/username"
         android:title="@string/username_title"
         android:dialogTitle="@string/username_title"
+        android:defaultValue=""
+        android:summary="@string/default_preference_summary"
         android:persistent="false"
         android:singleLine="true"/>
 
@@ -36,6 +40,8 @@
         android:key="@string/domain_address"
         android:title="@string/domain_address_title"
         android:dialogTitle="@string/domain_address_title"
+        android:defaultValue=""
+        android:summary="@string/default_preference_summary"
         android:persistent="false"
         android:singleLine="true"/>
 
@@ -44,6 +50,8 @@
         android:title="@string/password_title"
         android:dialogTitle="@string/password_title"
         android:password="true"
+        android:defaultValue=""
+        android:summary="@string/default_preference_summary"
         android:persistent="false"
         android:singleLine="true"/>
 
diff --git a/src/com/android/phone/sip/SipEditor.java b/src/com/android/phone/sip/SipEditor.java
index bdff215..2c9c5d3 100644
--- a/src/com/android/phone/sip/SipEditor.java
+++ b/src/com/android/phone/sip/SipEditor.java
@@ -57,12 +57,9 @@
 
     private static final String TAG = SipEditor.class.getSimpleName();
     private static final String KEY_PROFILE = "profile";
-    private static final String EMPTY = "";
-    private static final String LEAVE_AS_IS = null;
-    private static final String DEFAULT_SIP_PORT = "5060";
-    private static final String DEFAULT_PROTOCOL = "UDP";
     private static final String GET_METHOD_PREFIX = "get";
     private static final char SCRAMBLED = '*';
+    private static final int NA = 0;
 
     private PrimaryAccountSelector mPrimaryAccountSelector;
     private AdvancedSettings mAdvancedSettings;
@@ -70,27 +67,27 @@
     private boolean mDisplayNameSet;
 
     enum PreferenceKey {
-        ProfileName(R.string.profile_name, EMPTY),
-        DomainAddress(R.string.domain_address, EMPTY),
-        Username(R.string.username, EMPTY),
-        Password(R.string.password, EMPTY),
-        DisplayName(R.string.display_name, LEAVE_AS_IS),
-        ProxyAddress(R.string.proxy_address, EMPTY),
-        Port(R.string.port, DEFAULT_SIP_PORT),
-        Transport(R.string.transport, DEFAULT_PROTOCOL),
-        SendKeepAlive(R.string.send_keepalive, LEAVE_AS_IS);
+        ProfileName(R.string.profile_name, R.string.default_preference_summary),
+        DomainAddress(R.string.domain_address, R.string.default_preference_summary),
+        Username(R.string.username, R.string.default_preference_summary),
+        Password(R.string.password, R.string.default_preference_summary),
+        DisplayName(R.string.display_name, R.string.display_name_summary),
+        ProxyAddress(R.string.proxy_address, R.string.optional_summary),
+        Port(R.string.port, NA),
+        Transport(R.string.transport, NA),
+        SendKeepAlive(R.string.send_keepalive, NA);
 
         /**
          * @param key The key name of the preference.
          * @param defaultValue The default value of the preference.
          */
-        PreferenceKey(int text, String defaultValue) {
+        PreferenceKey(int text, int defaultValue) {
             this.text = text;
             this.defaultValue = defaultValue;
         }
 
         final int text;
-        final String defaultValue;
+        final int defaultValue;
         Preference preference;
     }
 
@@ -197,21 +194,17 @@
     private boolean validateAndSetResult() {
         for (PreferenceKey key : PreferenceKey.values()) {
             Preference pref = key.preference;
-            String value = EMPTY;
-            if (pref instanceof ListPreference) {
-                value = ((ListPreference)pref).getValue();
-            } else if (pref instanceof EditTextPreference) {
+            if (pref instanceof EditTextPreference) {
                 // use default value if display name is empty
                 if (pref == PreferenceKey.DisplayName.preference) continue;
-                value = ((EditTextPreference)pref).getText();
-            } else if (pref instanceof CheckBoxPreference) {
-                continue;
-            }
-            if (TextUtils.isEmpty(value) &&
-                    (key != PreferenceKey.ProxyAddress)) {
-                showAlert(pref.getTitle() + " "
-                        + getString(R.string.empty_alert));
-                return false;
+                if (pref == PreferenceKey.ProxyAddress.preference) continue;
+
+                String value = ((EditTextPreference) pref).getText();
+                if (TextUtils.isEmpty(value)) {
+                    showAlert(pref.getTitle() + " "
+                            + getString(R.string.empty_alert));
+                    return false;
+                }
             }
         }
         try {
@@ -241,7 +234,7 @@
                             ? getValue(PreferenceKey.DisplayName)
                             : getDefaultDisplayName())
                     .setPort(Integer.parseInt(getValue(PreferenceKey.Port)))
-                    .setSendKeepAlive(isChecked(PreferenceKey.SendKeepAlive))
+                    .setSendKeepAlive(isAlwaysSendKeepAlive())
                     .setAutoRegistration(
                             mSharedPreferences.isReceivingCallsEnabled())
                     .build();
@@ -249,24 +242,29 @@
 
     public boolean onPreferenceChange(Preference pref, Object newValue) {
         if (pref instanceof CheckBoxPreference) return true;
-        String value = (String) newValue;
-        if (value == null) value = EMPTY;
-        if (pref == PreferenceKey.Password.preference) {
-            pref.setSummary(scramble(newValue.toString()));
+        String value = (newValue == null) ? "" : newValue.toString();
+        if (TextUtils.isEmpty(value)) {
+            pref.setSummary(getPreferenceKey(pref).defaultValue);
+        } else if (pref == PreferenceKey.Password.preference) {
+            pref.setSummary(scramble(value));
         } else {
             pref.setSummary(value);
         }
 
-        if (pref instanceof EditTextPreference) {
-            ((EditTextPreference) pref).setText(value);
-        }
-
         if (pref == PreferenceKey.DisplayName.preference) {
+            ((EditTextPreference) pref).setText(value);
             checkIfDisplayNameSet();
         }
         return true;
     }
 
+    private PreferenceKey getPreferenceKey(Preference pref) {
+        for (PreferenceKey key : PreferenceKey.values()) {
+            if (key.preference == pref) return key;
+        }
+        throw new RuntimeException("not possible to reach here");
+    }
+
     private void loadPreferencesFromProfile(SipProfile p) {
         if (p != null) {
             Log.v(TAG, "Edit the existing profile : " + p.getProfileName());
@@ -275,17 +273,15 @@
                 for (PreferenceKey key : PreferenceKey.values()) {
                     Method meth = profileClass.getMethod(GET_METHOD_PREFIX
                             + getString(key.text), (Class[])null);
-                    if (key == PreferenceKey.Port) {
-                        setValue(key,
-                                String.valueOf(meth.invoke(p, (Object[])null)));
-                    } else if (key == PreferenceKey.SendKeepAlive) {
+                    if (key == PreferenceKey.SendKeepAlive) {
                         boolean value = ((Boolean)
                                 meth.invoke(p, (Object[]) null)).booleanValue();
                         setValue(key, getString(value
                                 ? R.string.sip_always_send_keepalive
                                 : R.string.sip_system_decide));
                     } else {
-                        setValue(key, (String) meth.invoke(p, (Object[])null));
+                        setValue(key,
+                                String.valueOf(meth.invoke(p, (Object[])null)));
                     }
                 }
                 checkIfDisplayNameSet();
@@ -295,27 +291,16 @@
         } else {
             Log.v(TAG, "Edit a new profile");
             for (PreferenceKey key : PreferenceKey.values()) {
-                if (key.defaultValue == LEAVE_AS_IS) continue;
                 Preference pref = key.preference;
                 pref.setOnPreferenceChangeListener(this);
-                if (pref instanceof EditTextPreference) {
-                    ((EditTextPreference) pref).setText(key.defaultValue);
-                } else if (pref instanceof ListPreference) {
-                    ((ListPreference) pref).setValue(key.defaultValue);
-                } else {
-                    continue;
-                }
-                pref.setSummary((EMPTY == key.defaultValue)
-                        ? getString(R.string.initial_preference_summary)
-                        : key.defaultValue);
             }
             mDisplayNameSet = false;
         }
     }
 
-    private boolean isChecked(PreferenceKey key) {
-        // must be PreferenceKey.SendKeepAlive
-        ListPreference pref = (ListPreference) key.preference;
+    private boolean isAlwaysSendKeepAlive() {
+        ListPreference pref = (ListPreference)
+                PreferenceKey.SendKeepAlive.preference;
         return getString(R.string.sip_always_send_keepalive).equals(
                 pref.getValue());
     }
@@ -344,9 +329,12 @@
         }
 
         if (TextUtils.isEmpty(value)) {
-            pref.setSummary(getString(R.string.initial_preference_summary));
+            pref.setSummary(getString(key.defaultValue));
         } else if (key == PreferenceKey.Password) {
             pref.setSummary(scramble(value));
+        } else if ((key == PreferenceKey.DisplayName)
+                && value.equals(getDefaultDisplayName())) {
+            pref.setSummary(getString(key.defaultValue));
         } else {
             pref.setSummary(value);
         }
@@ -372,8 +360,6 @@
             PreferenceKey.DisplayName.preference.setSummary(displayName);
         } else {
             setValue(PreferenceKey.DisplayName, "");
-            PreferenceKey.DisplayName.preference.setSummary(
-                    getString(R.string.display_name_summary));
         }
     }
 
