diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 405acaa..130674e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -100,6 +100,7 @@
         </activity-alias>
 
         <activity android:name=".wifi.WifiSettingsForSetupWizardXL"
+                  android:theme="@android:style/Theme.NoTitleBar"
                   android:clearTaskOnLaunch="true"
                   android:screenOrientation="landscape"
                   android:exported="true" />
@@ -196,10 +197,10 @@
             </intent-filter>
         </activity-alias>
 
-        <activity android:name=".vpn.VpnSettings"
-                android:label="@string/vpn_settings_title"
+        <activity-alias android:name=".vpn.VpnSettings"
                 android:configChanges="orientation|keyboardHidden"
-                android:clearTaskOnLaunch="true">
+                android:clearTaskOnLaunch="true"
+                android:targetActivity="Settings">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.net.vpn.SETTINGS" />
@@ -207,14 +208,7 @@
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="com.android.settings.SHORTCUT" />
             </intent-filter>
-        </activity>
-
-        <activity android:name=".vpn.VpnTypeSelection"
-                android:configChanges="orientation|keyboardHidden">
-        </activity>
-        <activity android:name=".vpn.VpnEditor"
-                android:configChanges="orientation|keyboardHidden">
-        </activity>
+        </activity-alias>
 
         <activity-alias android:name="DateTimeSettings"
                 android:label="@string/date_and_time"
@@ -228,8 +222,10 @@
             </intent-filter>
         </activity-alias>
 
-        <activity android:name="DateTimeSettingsSetupWizard" android:label="@string/date_and_time"
-            android:screenOrientation="behind">
+        <activity android:name="DateTimeSettingsSetupWizard"
+                  android:label="@string/date_and_time"
+                  android:theme="@android:style/Theme.NoTitleBar"
+                  android:screenOrientation="behind">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
             </intent-filter>
diff --git a/res/layout/wifi_dialog.xml b/res/layout/wifi_dialog.xml
index 081ab6c..8bf1fca 100644
--- a/res/layout/wifi_dialog.xml
+++ b/res/layout/wifi_dialog.xml
@@ -170,5 +170,98 @@
                     android:layout_height="wrap_content"
                     android:text="@string/wifi_show_password" />
         </LinearLayout>
+
+        <LinearLayout android:id="@+id/ipfields"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:visibility="gone">
+
+            <TextView
+                    style="?android:attr/textAppearanceSmallInverse"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dip"
+                    android:text="@string/wifi_ip_settings" />
+
+            <Spinner android:id="@+id/ipsettings"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:prompt="@string/wifi_ip_settings"
+                    android:entries="@array/wifi_ip_settings" />
+
+        </LinearLayout>
+
+        <LinearLayout android:id="@+id/staticip"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:visibility="gone">
+            <TextView
+                    style="?android:attr/textAppearanceSmallInverse"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dip"
+                    android:text="@string/wifi_ip_address" />
+
+            <EditText android:id="@+id/ipaddress"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:inputType="textNoSuggestions" />
+
+            <TextView
+                    style="?android:attr/textAppearanceSmallInverse"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dip"
+                    android:text="@string/wifi_gateway" />
+
+            <EditText android:id="@+id/gateway"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:inputType="textNoSuggestions" />
+
+            <TextView
+                    style="?android:attr/textAppearanceSmallInverse"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dip"
+                    android:text="@string/wifi_netmask" />
+
+            <EditText android:id="@+id/netmask"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:inputType="textNoSuggestions" />
+
+            <TextView
+                    style="?android:attr/textAppearanceSmallInverse"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dip"
+                    android:text="@string/wifi_dns1" />
+
+            <EditText android:id="@+id/dns1"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:inputType="textNoSuggestions" />
+
+            <TextView
+                    style="?android:attr/textAppearanceSmallInverse"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dip"
+                    android:text="@string/wifi_dns2" />
+
+            <EditText android:id="@+id/dns2"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:inputType="textNoSuggestions" />
+
+        </LinearLayout>
     </LinearLayout>
 </ScrollView>
diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index 0b44edd..e3acc10 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -341,6 +341,15 @@
         <item>GTC</item>
     </string-array>
 
+    <!-- Wi-Fi IP settings. -->
+    <string-array name="wifi_ip_settings">
+        <!-- Do not translate. -->
+        <item>DHCP</item>
+        <!-- Do not translate. -->
+        <item>Static</item>
+    </string-array>
+
+
     <!-- Sound settings for emergency tone. -->
     <string-array name="emergency_tone_entries">
         <item>Off</item>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b2a1865..84bc6cc 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -895,7 +895,9 @@
     <!-- Label for the password of the secured network -->
     <string name="wifi_password">Password</string>
     <!-- Label for the check box to show password -->
-    <string name="wifi_show_password">Show password.</string>
+    <string name="wifi_show_password">Show password</string>
+    <!-- Label for the spinner to show ip settings  -->
+    <string name="wifi_ip_settings">IP settings</string>
     <!-- Hint for unchanged fields -->
     <string name="wifi_unchanged">(unchanged)</string>
     <!-- Hint for unspecified fields -->
@@ -949,8 +951,6 @@
     <string name="wifi_ip_settings_menu_cancel">Cancel</string>
     <!-- Error message if the IP address is not valid -->
     <string name="wifi_ip_settings_invalid_ip">Please type a valid IP address.</string>
-    <!-- Checkbox for whether to use a static IP address -->
-    <string name="wifi_use_static_ip">Use static IP</string>
     <!-- Label for the DNS (first one) -->
     <string name="wifi_dns1">DNS 1</string>
     <!-- Label for the DNS (second one)-->
diff --git a/res/xml/wifi_advanced_settings.xml b/res/xml/wifi_advanced_settings.xml
index e603be9..8496428 100644
--- a/res/xml/wifi_advanced_settings.xml
+++ b/res/xml/wifi_advanced_settings.xml
@@ -43,54 +43,4 @@
         android:title="@string/wifi_advanced_ip_address_title"
         />
 
-    <PreferenceCategory
-            android:title="@string/wifi_ip_settings_titlebar"
-            />
-    
-    <CheckBoxPreference
-            android:key="use_static_ip"
-            android:title="@string/wifi_use_static_ip"
-            android:persistent="false"
-            />    
-    
-    <EditTextPreference
-            android:dependency="use_static_ip"
-            android:key="ip_address"
-            android:title="@string/wifi_ip_address"
-            android:persistent="false"
-            android:singleLine="true"
-            />    
-    
-    <EditTextPreference
-            android:dependency="use_static_ip"
-            android:key="gateway"
-            android:title="@string/wifi_gateway"
-            android:persistent="false"
-            android:singleLine="true"
-            />    
-    
-    <EditTextPreference
-            android:dependency="use_static_ip"
-            android:key="netmask"
-            android:title="@string/wifi_netmask"
-            android:persistent="false"
-            android:singleLine="true"
-            />    
-
-    <EditTextPreference
-            android:dependency="use_static_ip"
-            android:key="dns1"
-            android:title="@string/wifi_dns1"
-            android:persistent="false"
-            android:singleLine="true"
-            />    
-    
-    <EditTextPreference
-            android:dependency="use_static_ip"
-            android:key="dns2"
-            android:title="@string/wifi_dns2"
-            android:persistent="false"
-            android:singleLine="true"
-            />    
-    
 </PreferenceScreen>   
diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml
index 8e05e60..f6d0012 100644
--- a/res/xml/wireless_settings.xml
+++ b/res/xml/wireless_settings.xml
@@ -59,13 +59,10 @@
     </PreferenceScreen>
 
     <PreferenceScreen
+        android:fragment="com.android.settings.vpn.VpnSettings"
         android:key="vpn_settings"
         android:title="@string/vpn_settings_title"
         android:summary="@string/vpn_settings_summary" >
-        <intent
-            android:action="android.intent.action.MAIN"
-            android:targetPackage="com.android.settings"
-            android:targetClass="com.android.settings.vpn.VpnSettings" />
     </PreferenceScreen>
 
     <PreferenceScreen
diff --git a/src/com/android/settings/DateTimeSettingsSetupWizard.java b/src/com/android/settings/DateTimeSettingsSetupWizard.java
index 5da17da..016a7f2 100644
--- a/src/com/android/settings/DateTimeSettingsSetupWizard.java
+++ b/src/com/android/settings/DateTimeSettingsSetupWizard.java
@@ -19,6 +19,7 @@
 import com.android.settings.ZonePicker.ZoneSelectionListener;
 
 import android.app.Activity;
+import android.content.Context;
 import android.content.res.Configuration;
 import android.os.Bundle;
 import android.provider.Settings;
@@ -26,6 +27,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.Window;
+import android.view.inputmethod.InputMethodManager;
 import android.widget.Button;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
@@ -44,6 +46,7 @@
     private Button mTimeZone;
     private TimePicker mTimePicker;
     private DatePicker mDatePicker;
+    private InputMethodManager mInputMethodManager;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -90,6 +93,8 @@
         mDatePicker = (DatePicker)findViewById(R.id.date_picker);
         mDatePicker.setEnabled(!autoDateTimeEnabled);
 
+        mInputMethodManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
+
         ((ZonePicker)getFragmentManager().findFragmentById(R.id.zone_picker_fragment))
                 .setZoneSelectionListener(this);
 
@@ -123,6 +128,7 @@
 
     @Override
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+        final boolean autoEnabled = isChecked;  // just for readibility.
         Settings.System.putInt(getContentResolver(),
                 Settings.System.AUTO_TIME,
                 isChecked ? 1 : 0);
@@ -130,9 +136,16 @@
             findViewById(R.id.current_time_zone).setVisibility(View.VISIBLE);
             findViewById(R.id.zone_picker).setVisibility(View.GONE);
         }
-        mTimeZone.setEnabled(!isChecked);
-        mTimePicker.setEnabled(!isChecked);
-        mDatePicker.setEnabled(!isChecked);
+        mTimeZone.setEnabled(!autoEnabled);
+        mTimePicker.setEnabled(!autoEnabled);
+        mDatePicker.setEnabled(!autoEnabled);
+        if (autoEnabled) {
+            final View focusedView = getCurrentFocus();
+            if (focusedView != null) {
+                mInputMethodManager.hideSoftInputFromWindow(focusedView.getWindowToken(), 0);
+                focusedView.clearFocus();
+            }
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/LocalePicker.java b/src/com/android/settings/LocalePicker.java
index 2030e95..8b94ccb 100644
--- a/src/com/android/settings/LocalePicker.java
+++ b/src/com/android/settings/LocalePicker.java
@@ -16,6 +16,8 @@
 
 package com.android.settings;
 
+import java.util.Locale;
+
 public class LocalePicker extends com.android.internal.app.LocalePicker
         implements com.android.internal.app.LocalePicker.LocaleSelectionListener {
     public LocalePicker() {
@@ -24,7 +26,8 @@
     }
 
     @Override
-    public void onLocaleSelected() {
+    public void onLocaleSelected(Locale locale) {
         getActivity().onBackPressed();
+        LocalePicker.updateLocale(locale);
     }
 }
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 50aa1df..cc3f7ea 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -41,7 +41,8 @@
  */
 public class Settings extends Activity
         implements PreferenceFragment.OnPreferenceStartFragmentCallback,
-        SettingsPreferenceFragment.OnStateListener {
+        SettingsPreferenceFragment.OnStateListener,
+        SettingsPreferenceFragment.FragmentStarter {
 
     private static final boolean DBG = false;
 
@@ -143,7 +144,9 @@
         if (DBG) Log.d(TAG, "showFragment");
        Fragment f = Fragment.instantiate(this, fragmentClass, extras);
         if (f instanceof SettingsPreferenceFragment) {
-            ((SettingsPreferenceFragment) f).setOnStateListener(this);
+            SettingsPreferenceFragment spf = (SettingsPreferenceFragment) f;
+            spf.setOnStateListener(this);
+            spf.setFragmentStarter(this);
         }
         mBreadCrumbs.clear();
         getFragmentManager().popBackStack(BACK_STACK_PREFS, POP_BACK_STACK_INCLUSIVE);
@@ -176,9 +179,17 @@
 
     public boolean onPreferenceStartFragment(PreferenceFragment caller, Preference pref) {
         if (DBG) Log.d(TAG, "onPreferenceStartFragment");
-        Fragment f = Fragment.instantiate(this, pref.getFragment(), pref.getExtras());
+        return startFragment(caller, pref.getFragment(), -1, pref.getExtras());
+    }
+
+    public boolean startFragment(
+            Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
+        Fragment f = Fragment.instantiate(this, fragmentClass, extras);
+        caller.setTargetFragment(f, requestCode);
         if (f instanceof SettingsPreferenceFragment) {
-            ((SettingsPreferenceFragment) f).setOnStateListener(this);
+            SettingsPreferenceFragment spf = (SettingsPreferenceFragment) f;
+            spf.setOnStateListener(this);
+            spf.setFragmentStarter(this);
         }
         getFragmentManager().openTransaction().replace(R.id.prefs, f)
                 .addToBackStack(BACK_STACK_PREFS).commit();
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 935c72a..f41561e 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -19,6 +19,7 @@
 import android.app.Activity;
 import android.app.Dialog;
 import android.app.DialogFragment;
+import android.app.Fragment;
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -58,6 +59,10 @@
     private SettingsDialogFragment mDialogFragment;
 
     private OnStateListener mOnStateListener;
+    private FragmentStarter mFragmentStarter;
+
+    private int mResultCode = Activity.RESULT_CANCELED;
+    private Intent mResultData;
 
     private Button mNextButton;
 
@@ -74,6 +79,43 @@
         mOnStateListener = listener;
     }
 
+    /**
+     * Letting the class, assumed to be Fragment, start another Fragment object.
+     * The target Fragment object is stored in the caller Fragment using
+     * {@link Fragment#setTargetFragment(Fragment, int)}. The caller
+     * is able to obtain result code and result data via
+     * {@link SettingsPreferenceFragment#getResultCode()} and
+     * {@link SettingsPreferenceFragment#getResultData()} accordingly.
+     */
+    interface FragmentStarter {
+        public boolean startFragment(
+                Fragment caller, String fragmentClass, int requestCode, Bundle extras);
+    }
+
+    public void setFragmentStarter(FragmentStarter starter) {
+        mFragmentStarter = starter;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+
+        final Fragment f = getTargetFragment();
+        final int requestCode = getTargetRequestCode();
+
+        // TargetFragment becomes invalid when this object is resumed. Notify it to
+        // FragmentManager. Without this code, FragmentManager wrongly take the TargetFragment
+        // as live, and throws IllegalStateException.
+        setTargetFragment(null, -1);
+
+        if (f != null && (f instanceof SettingsPreferenceFragment)) {
+            final SettingsPreferenceFragment spf = (SettingsPreferenceFragment)f;
+            final int resultCode = spf.getResultCode();
+            final Intent resultData = spf.getResultData();
+            onActivityResult(requestCode, resultCode, resultData);
+        }
+    }
+
     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
@@ -86,6 +128,32 @@
         setupButtonBar();
     }
 
+    public final void setResult(int resultCode) {
+        mResultCode = resultCode;
+        mResultData = null;
+    }
+
+    public final void setResult(int resultCode, Intent data) {
+        mResultCode = resultCode;
+        mResultData = data;
+    }
+
+    public final int getResultCode() {
+        return mResultCode;
+    }
+
+    public final Intent getResultData() {
+        return mResultData;
+    }
+
+    /*
+     * The name is intentionally made different from Activity#finish(), so that
+     * users won't misunderstand its meaning.
+     */
+    public final void finishFragment() {
+        getActivity().onBackPressed();
+    }
+
     @Override
     public void onDestroy() {
         super.onDestroy();
@@ -179,6 +247,16 @@
         getActivity().onBackPressed();
     }
 
+    public boolean startFragment(
+            Fragment caller, String fragmentClass, int requestCode, Bundle extras) {
+        if (mFragmentStarter != null) {
+            return mFragmentStarter.startFragment(caller, fragmentClass, requestCode, extras);
+        } else {
+            Log.w(TAG, "FragmentStarter is not set.");
+            return false;
+        }
+    }
+
     /**
      * Sets up Button Bar possibly required in the Fragment. Probably available only in
      * phones.
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 8765dfb..af03549 100644
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -69,6 +69,7 @@
 public class InstalledAppDetails extends Activity
         implements View.OnClickListener, ApplicationsState.Callbacks {
     private static final String TAG="InstalledAppDetails";
+    static final boolean SUPPORT_DISABLE_APPS = false;
     
     private PackageManager mPm;
     private ApplicationsState mState;
@@ -259,30 +260,32 @@
         } else {
             if ((mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {
                 enabled = false;
-                try {
-                    // Try to prevent the user from bricking their phone
-                    // by not allowing disabling of apps signed with the
-                    // system cert and any launcher app in the system.
-                    PackageInfo sys = mPm.getPackageInfo("android",
-                            PackageManager.GET_SIGNATURES);
-                    Intent intent = new Intent(Intent.ACTION_MAIN);
-                    intent.addCategory(Intent.CATEGORY_HOME);
-                    intent.setPackage(mAppEntry.info.packageName);
-                    List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
-                    if ((homes != null && homes.size() > 0) ||
-                            (mPackageInfo != null &&
-                                    sys.signatures[0].equals(mPackageInfo.signatures[0]))) {
-                        // Disable button for core system applications.
-                        mUninstallButton.setText(R.string.disable_text);
-                    } else if (mAppEntry.info.enabled) {
-                        mUninstallButton.setText(R.string.disable_text);
-                        enabled = true;
-                    } else {
-                        mUninstallButton.setText(R.string.enable_text);
-                        enabled = true;
+                if (SUPPORT_DISABLE_APPS) {
+                    try {
+                        // Try to prevent the user from bricking their phone
+                        // by not allowing disabling of apps signed with the
+                        // system cert and any launcher app in the system.
+                        PackageInfo sys = mPm.getPackageInfo("android",
+                                PackageManager.GET_SIGNATURES);
+                        Intent intent = new Intent(Intent.ACTION_MAIN);
+                        intent.addCategory(Intent.CATEGORY_HOME);
+                        intent.setPackage(mAppEntry.info.packageName);
+                        List<ResolveInfo> homes = mPm.queryIntentActivities(intent, 0);
+                        if ((homes != null && homes.size() > 0) ||
+                                (mPackageInfo != null &&
+                                        sys.signatures[0].equals(mPackageInfo.signatures[0]))) {
+                            // Disable button for core system applications.
+                            mUninstallButton.setText(R.string.disable_text);
+                        } else if (mAppEntry.info.enabled) {
+                            mUninstallButton.setText(R.string.disable_text);
+                            enabled = true;
+                        } else {
+                            mUninstallButton.setText(R.string.enable_text);
+                            enabled = true;
+                        }
+                    } catch (PackageManager.NameNotFoundException e) {
+                        Log.w(TAG, "Unable to get package info", e);
                     }
-                } catch (PackageManager.NameNotFoundException e) {
-                    Log.w(TAG, "Unable to get package info", e);
                 }
             } else {
                 mUninstallButton.setText(R.string.uninstall_text);
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 772e48d..34e0e8e 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -354,7 +354,11 @@
                     holder.appIcon.setImageDrawable(entry.icon);
                 }
                 holder.updateSizeText(ManageApplications.this);
-                holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE);
+                if (InstalledAppDetails.SUPPORT_DISABLE_APPS) {
+                    holder.disabled.setVisibility(entry.info.enabled ? View.GONE : View.VISIBLE);
+                } else {
+                    holder.disabled.setVisibility(View.GONE);
+                }
             }
             mActive.remove(convertView);
             mActive.add(convertView);
diff --git a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
index eec0ad8..37e48ff 100644
--- a/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
+++ b/src/com/android/settings/bluetooth/BluetoothDiscoverableEnabler.java
@@ -144,7 +144,7 @@
     private void persistDiscoverableEndTimestamp(long endTimestamp) {
         SharedPreferences.Editor editor = mLocalManager.getSharedPreferences().edit();
         editor.putLong(SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP, endTimestamp);
-        editor.commit();
+        editor.apply();
     }
 
     private void handleModeChanged(int mode) {
diff --git a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
index f3a404f..54fde9d 100644
--- a/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
+++ b/src/com/android/settings/bluetooth/BluetoothEventRedirector.java
@@ -227,6 +227,6 @@
         SharedPreferences.Editor editor = mManager.getSharedPreferences().edit();
         editor.putLong(LocalBluetoothManager.SHARED_PREFERENCES_KEY_DISCOVERING_TIMESTAMP,
                 System.currentTimeMillis());
-        editor.commit();
+        editor.apply();
     }
 }
diff --git a/src/com/android/settings/bluetooth/DockService.java b/src/com/android/settings/bluetooth/DockService.java
index d0f8099..db24554 100644
--- a/src/com/android/settings/bluetooth/DockService.java
+++ b/src/com/android/settings/bluetooth/DockService.java
@@ -788,14 +788,14 @@
         SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFERENCES_NAME,
                 Context.MODE_PRIVATE).edit();
         editor.putBoolean(key, bool);
-        editor.commit();
+        editor.apply();
     }
 
     private void setSettingInt(String key, int value) {
         SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFERENCES_NAME,
                 Context.MODE_PRIVATE).edit();
         editor.putInt(key, value);
-        editor.commit();
+        editor.apply();
     }
 
     private void removeSetting(String key) {
@@ -803,8 +803,7 @@
                 Context.MODE_PRIVATE);
         SharedPreferences.Editor editor = sharedPref.edit();
         editor.remove(key);
-        editor.commit();
-        return;
+        editor.apply();
     }
 
     public synchronized void onServiceConnected() {
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothManager.java b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
index 2ffb139..97e823e 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothManager.java
@@ -356,7 +356,7 @@
                 deviceAddress);
         editor.putLong(LocalBluetoothManager.SHARED_PREFERENCES_KEY_LAST_SELECTED_DEVICE_TIME,
                 System.currentTimeMillis());
-        editor.commit();
+        editor.apply();
     }
 
     public boolean hasDockAutoConnectSetting(String addr) {
@@ -371,12 +371,12 @@
     public void saveDockAutoConnectSetting(String addr, boolean autoConnect) {
         SharedPreferences.Editor editor = getSharedPreferences().edit();
         editor.putBoolean(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr, autoConnect);
-        editor.commit();
+        editor.apply();
     }
 
     public void removeDockAutoConnectSetting(String addr) {
         SharedPreferences.Editor editor = getSharedPreferences().edit();
         editor.remove(SHARED_PREFERENCES_KEY_DOCK_AUTO_CONNECT + addr);
-        editor.commit();
+        editor.apply();
     }
 }
diff --git a/src/com/android/settings/bluetooth/RequestPermissionActivity.java b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
index eca233c..dd802f3 100644
--- a/src/com/android/settings/bluetooth/RequestPermissionActivity.java
+++ b/src/com/android/settings/bluetooth/RequestPermissionActivity.java
@@ -277,7 +277,7 @@
         editor.putLong(
                 BluetoothDiscoverableEnabler.SHARED_PREFERENCES_KEY_DISCOVERABLE_END_TIMESTAMP,
                 endTimestamp);
-        editor.commit();
+        editor.apply();
     }
 
     @Override
diff --git a/src/com/android/settings/vpn/VpnEditor.java b/src/com/android/settings/vpn/VpnEditor.java
index 349befb..3ab0b90 100644
--- a/src/com/android/settings/vpn/VpnEditor.java
+++ b/src/com/android/settings/vpn/VpnEditor.java
@@ -17,7 +17,9 @@
 package com.android.settings.vpn;
 
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.content.DialogInterface;
@@ -27,22 +29,19 @@
 import android.net.vpn.L2tpProfile;
 import android.net.vpn.PptpProfile;
 import android.net.vpn.VpnProfile;
-import android.net.vpn.VpnType;
 import android.os.Bundle;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.preference.PreferenceActivity;
-import android.preference.PreferenceGroup;
 import android.text.TextUtils;
-import android.view.KeyEvent;
+import android.util.Log;
 import android.view.Menu;
+import android.view.MenuInflater;
 import android.view.MenuItem;
-import android.view.View;
 
 /**
  * The activity class for editing a new or existing VPN profile.
  */
-public class VpnEditor extends PreferenceActivity {
+public class VpnEditor extends SettingsPreferenceFragment {
     private static final int MENU_SAVE = Menu.FIRST;
     private static final int MENU_CANCEL = Menu.FIRST + 1;
     private static final int CONFIRM_DIALOG_ID = 0;
@@ -56,59 +55,75 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        VpnProfile p = (VpnProfile) ((savedInstanceState == null)
-                ? getIntent().getParcelableExtra(VpnSettings.KEY_VPN_PROFILE)
-                : savedInstanceState.getParcelable(KEY_PROFILE));
-        mProfileEditor = getEditor(p);
-        mAddingProfile = TextUtils.isEmpty(p.getName());
 
         // Loads the XML preferences file
         addPreferencesFromResource(R.xml.vpn_edit);
+    }
+
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        VpnProfile p;
+        if (savedInstanceState != null) {
+            p = (VpnProfile)savedInstanceState.getParcelable(KEY_PROFILE);
+        } else {
+            p = (VpnProfile)getArguments().getParcelable(VpnSettings.KEY_VPN_PROFILE);
+            if (p == null) {
+                p = getActivity().getIntent().getParcelableExtra(VpnSettings.KEY_VPN_PROFILE);
+            }
+        }
+
+        mProfileEditor = getEditor(p);
+        mAddingProfile = TextUtils.isEmpty(p.getName());
 
         initViewFor(p);
 
         Parcel parcel = Parcel.obtain();
         p.writeToParcel(parcel, 0);
         mOriginalProfileData = parcel.marshall();
+
+        registerForContextMenu(getListView());
+        setHasOptionsMenu(true);
     }
 
     @Override
-    protected synchronized void onSaveInstanceState(Bundle outState) {
+    public synchronized void onSaveInstanceState(Bundle outState) {
         if (mProfileEditor == null) return;
 
         outState.putParcelable(KEY_PROFILE, getProfile());
     }
 
     @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        super.onCreateOptionsMenu(menu);
+    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+        super.onCreateOptionsMenu(menu, inflater);
         menu.add(0, MENU_SAVE, 0, R.string.vpn_menu_done)
             .setIcon(android.R.drawable.ic_menu_save);
         menu.add(0, MENU_CANCEL, 0,
                 mAddingProfile ? R.string.vpn_menu_cancel
                                : R.string.vpn_menu_revert)
             .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
-        return true;
     }
 
     @Override
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case MENU_SAVE:
-                if (validateAndSetResult()) finish();
+                if (validateAndSetResult()) finishFragment();
                 return true;
 
             case MENU_CANCEL:
                 if (profileChanged()) {
                     showDialog(CONFIRM_DIALOG_ID);
                 } else {
-                    finish();
+                    finishFragment();
                 }
                 return true;
         }
         return super.onOptionsItemSelected(item);
     }
 
+    /*
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
         switch (keyCode) {
@@ -117,7 +132,7 @@
                 return true;
         }
         return super.onKeyDown(keyCode, event);
-    }
+    }*/
 
     private void initViewFor(VpnProfile profile) {
         setTitle(profile);
@@ -125,10 +140,11 @@
     }
 
     private void setTitle(VpnProfile profile) {
+        final Activity activity = getActivity();
         String formatString = mAddingProfile
-                ? getString(R.string.vpn_edit_title_add)
-                : getString(R.string.vpn_edit_title_edit);
-        setTitle(String.format(formatString,
+                ? activity.getString(R.string.vpn_edit_title_add)
+                : activity.getString(R.string.vpn_edit_title_edit);
+        activity.setTitle(String.format(formatString,
                 profile.getType().getDisplayName()));
     }
 
@@ -140,7 +156,7 @@
         String errorMsg = mProfileEditor.validate();
 
         if (errorMsg != null) {
-            Util.showErrorMessage(this, errorMsg);
+            Util.showErrorMessage(getActivity(), errorMsg);
             return false;
         }
 
@@ -149,9 +165,9 @@
     }
 
     private void setResult(VpnProfile p) {
-        Intent intent = new Intent(this, VpnSettings.class);
+        Intent intent = new Intent(getActivity(), VpnSettings.class);
         intent.putExtra(VpnSettings.KEY_VPN_PROFILE, (Parcelable) p);
-        setResult(RESULT_OK, intent);
+        setResult(Activity.RESULT_OK, intent);
     }
 
     private VpnProfileEditor getEditor(VpnProfile p) {
@@ -175,10 +191,9 @@
 
 
     @Override
-    protected Dialog onCreateDialog(int id) {
-
+    public Dialog onCreateDialog(int id) {
         if (id == CONFIRM_DIALOG_ID) {
-            return new AlertDialog.Builder(this)
+            return new AlertDialog.Builder(getActivity())
                     .setTitle(android.R.string.dialog_alert_title)
                     .setIcon(android.R.drawable.ic_dialog_alert)
                     .setMessage(mAddingProfile
@@ -187,7 +202,7 @@
                     .setPositiveButton(R.string.vpn_yes_button,
                             new DialogInterface.OnClickListener() {
                                 public void onClick(DialogInterface dialog, int w) {
-                                    finish();
+                                    finishFragment();
                                 }
                             })
                     .setNegativeButton(R.string.vpn_mistake_button, null)
@@ -197,8 +212,9 @@
         return super.onCreateDialog(id);
     }
 
+    /*
     @Override
-    protected void onPrepareDialog(int id, Dialog dialog) {
+    public void onPrepareDialog(int id, Dialog dialog) {
         super.onPrepareDialog(id, dialog);
 
         if (id == CONFIRM_DIALOG_ID) {
@@ -206,7 +222,7 @@
                     ? getString(R.string.vpn_confirm_add_profile_cancellation)
                     : getString(R.string.vpn_confirm_edit_profile_cancellation));
         }
-    }
+    }*/
 
     private VpnProfile getProfile() {
         return mProfileEditor.getProfile();
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index 7b8d433..e9a4c3d 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -17,11 +17,14 @@
 package com.android.settings.vpn;
 
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 
+import android.app.Activity;
 import android.app.AlertDialog;
 import android.app.Dialog;
-import android.content.ComponentName;
+import android.app.Fragment;
 import android.content.BroadcastReceiver;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -37,12 +40,10 @@
 import android.os.Bundle;
 import android.os.ConditionVariable;
 import android.os.IBinder;
-import android.os.Parcelable;
 import android.preference.Preference;
-import android.preference.PreferenceActivity;
+import android.preference.Preference.OnPreferenceClickListener;
 import android.preference.PreferenceCategory;
 import android.preference.PreferenceScreen;
-import android.preference.Preference.OnPreferenceClickListener;
 import android.security.Credentials;
 import android.security.KeyStore;
 import android.text.TextUtils;
@@ -69,8 +70,8 @@
 /**
  * The preference activity for configuring VPN settings.
  */
-public class VpnSettings extends PreferenceActivity implements
-        DialogInterface.OnClickListener {
+public class VpnSettings extends SettingsPreferenceFragment
+        implements DialogInterface.OnClickListener {
     // Key to the field exchanged for profile editing.
     static final String KEY_VPN_PROFILE = "vpn_profile";
 
@@ -122,7 +123,7 @@
 
     private KeyStore mKeyStore = KeyStore.getInstance();
 
-    private VpnManager mVpnManager = new VpnManager(this);
+    private VpnManager mVpnManager;
 
     private ConnectivityReceiver mConnectivityReceiver =
             new ConnectivityReceiver();
@@ -137,7 +138,13 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         addPreferencesFromResource(R.xml.vpn_settings);
+    }
 
+    @Override
+    public void onActivityCreated(Bundle savedInstanceState) {
+        super.onActivityCreated(savedInstanceState);
+
+        mVpnManager = new VpnManager(getActivity());
         // restore VpnProfile list and construct VpnPreference map
         mVpnListContainer = (PreferenceCategory) findPreference(PREF_VPN_LIST);
 
@@ -168,22 +175,24 @@
         if ((mUnlockAction != null) && isKeyStoreUnlocked()) {
             Runnable action = mUnlockAction;
             mUnlockAction = null;
-            runOnUiThread(action);
+            getActivity().runOnUiThread(action);
         }
     }
 
     @Override
-    protected void onDestroy() {
-        super.onDestroy();
+    public void onDestroyView() {
         unregisterForContextMenu(getListView());
         mVpnManager.unregisterConnectivityReceiver(mConnectivityReceiver);
         if ((mShowingDialog != null) && mShowingDialog.isShowing()) {
             mShowingDialog.dismiss();
         }
+        // This should be called after the procedure above as ListView inside this Fragment
+        // will be deleted here.
+        super.onDestroyView();
     }
 
     @Override
-    protected Dialog onCreateDialog (int id) {
+    public Dialog onCreateDialog (int id) {
         switch (id) {
             case DIALOG_CONNECT:
                 return createConnectDialog();
@@ -203,13 +212,14 @@
     }
 
     private Dialog createConnectDialog() {
-        return new AlertDialog.Builder(this)
+        final Activity activity = getActivity();
+        return new AlertDialog.Builder(activity)
                 .setView(mConnectingActor.createConnectView())
-                .setTitle(String.format(getString(R.string.vpn_connect_to),
+                .setTitle(String.format(activity.getString(R.string.vpn_connect_to),
                         mActiveProfile.getName()))
-                .setPositiveButton(getString(R.string.vpn_connect_button),
+                .setPositiveButton(activity.getString(R.string.vpn_connect_button),
                         this)
-                .setNegativeButton(getString(android.R.string.cancel),
+                .setNegativeButton(activity.getString(android.R.string.cancel),
                         this)
                 .setOnCancelListener(new DialogInterface.OnCancelListener() {
                             public void onCancel(DialogInterface dialog) {
@@ -291,7 +301,7 @@
     }
 
     private AlertDialog.Builder createCommonDialogBuilder() {
-        return new AlertDialog.Builder(this)
+        return new AlertDialog.Builder(getActivity())
                 .setTitle(android.R.string.dialog_alert_title)
                 .setIcon(android.R.drawable.ic_dialog_alert)
                 .setPositiveButton(R.string.vpn_yes_button,
@@ -364,9 +374,9 @@
     }
 
     @Override
-    protected void onActivityResult(final int requestCode, final int resultCode,
+    public void onActivityResult(final int requestCode, final int resultCode,
             final Intent data) {
-        if ((resultCode == RESULT_CANCELED) || (data == null)) {
+        if ((resultCode == Activity.RESULT_CANCELED) || (data == null)) {
             Log.d(TAG, "no result returned by editor");
             return;
         }
@@ -381,11 +391,12 @@
                 return;
             }
 
+            final Activity activity = getActivity();
             int index = getProfileIndexFromId(p.getId());
             if (checkDuplicateName(p, index)) {
                 final VpnProfile profile = p;
-                Util.showErrorMessage(this, String.format(
-                        getString(R.string.vpn_error_duplicate_name),
+                Util.showErrorMessage(activity, String.format(
+                        activity.getString(R.string.vpn_error_duplicate_name),
                         p.getName()),
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
@@ -407,30 +418,32 @@
             try {
                 if (index < 0) {
                     addProfile(p);
-                    Util.showShortToastMessage(this, String.format(
-                            getString(R.string.vpn_profile_added), p.getName()));
+                    Util.showShortToastMessage(activity, String.format(
+                            activity.getString(R.string.vpn_profile_added), p.getName()));
                 } else {
                     replaceProfile(index, p);
-                    Util.showShortToastMessage(this, String.format(
-                            getString(R.string.vpn_profile_replaced),
+                    Util.showShortToastMessage(activity, String.format(
+                            activity.getString(R.string.vpn_profile_replaced),
                             p.getName()));
                 }
             } catch (IOException e) {
                 final VpnProfile profile = p;
-                Util.showErrorMessage(this, e + ": " + e.getMessage(),
+                Util.showErrorMessage(activity, e + ": " + e.getMessage(),
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog, int w) {
                                 startVpnEditor(profile);
                             }
                         });
             }
+
+            // Remove cached VpnEditor as it is needless anymore.
         } else {
             throw new RuntimeException("unknown request code: " + requestCode);
         }
     }
 
     // Called when the buttons on the connect dialog are clicked.
-    //@Override
+    @Override
     public synchronized void onClick(DialogInterface dialog, int which) {
         if (which == CONNECT_BUTTON) {
             Dialog d = (Dialog) dialog;
@@ -440,12 +453,15 @@
                 removeDialog(DIALOG_CONNECT);
                 return;
             } else {
-                dismissDialog(DIALOG_CONNECT);
+                // dismissDialog(DIALOG_CONNECT);
+                removeDialog(DIALOG_CONNECT);
+
+                final Activity activity = getActivity();
                 // show error dialog
-                mShowingDialog = new AlertDialog.Builder(this)
+                mShowingDialog = new AlertDialog.Builder(activity)
                         .setTitle(android.R.string.dialog_alert_title)
                         .setIcon(android.R.drawable.ic_dialog_alert)
-                        .setMessage(String.format(getString(
+                        .setMessage(String.format(activity.getString(
                                 R.string.vpn_error_miss_entering), error))
                         .setPositiveButton(R.string.vpn_back_button,
                                 new DialogInterface.OnClickListener() {
@@ -513,7 +529,7 @@
                         }
                     }
                 };
-        mShowingDialog = new AlertDialog.Builder(this)
+        mShowingDialog = new AlertDialog.Builder(getActivity())
                 .setTitle(android.R.string.dialog_alert_title)
                 .setIcon(android.R.drawable.ic_dialog_alert)
                 .setMessage(R.string.vpn_confirm_profile_deletion)
@@ -559,7 +575,7 @@
     // Adds a preference in mVpnListContainer
     private VpnPreference addPreferenceFor(
             VpnProfile p, boolean addToContainer) {
-        VpnPreference pref = new VpnPreference(this, p);
+        VpnPreference pref = new VpnPreference(getActivity(), p);
         mVpnPreferenceMap.put(p.getName(), pref);
         if (addToContainer) mVpnListContainer.addPreference(pref);
 
@@ -599,8 +615,8 @@
     }
 
     private void startVpnTypeSelection() {
-        Intent intent = new Intent(this, VpnTypeSelection.class);
-        startActivityForResult(intent, REQUEST_SELECT_VPN_TYPE);
+        startFragment(this, VpnTypeSelection.class.getCanonicalName(),
+                REQUEST_SELECT_VPN_TYPE, null);
     }
 
     private boolean isKeyStoreUnlocked() {
@@ -614,16 +630,14 @@
                 L2tpIpsecPskProfile pskProfile = (L2tpIpsecPskProfile) p;
                 String presharedKey = pskProfile.getPresharedKey();
                 if (!TextUtils.isEmpty(presharedKey)) return true;
-                // pass through
-
+                // $FALL-THROUGH$
             case L2TP:
                 L2tpProfile l2tpProfile = (L2tpProfile) p;
                 if (l2tpProfile.isSecretEnabled() &&
                         !TextUtils.isEmpty(l2tpProfile.getSecretString())) {
                     return true;
                 }
-                // pass through
-
+                // $FALL-THROUGH$
             default:
                 return false;
         }
@@ -648,14 +662,15 @@
     private boolean unlockKeyStore(VpnProfile p, Runnable action) {
         if (isKeyStoreUnlocked()) return true;
         mUnlockAction = action;
-        Credentials.getInstance().unlock(this);
+        Credentials.getInstance().unlock(getActivity());
         return false;
     }
 
     private void startVpnEditor(final VpnProfile profile) {
-        Intent intent = new Intent(this, VpnEditor.class);
-        intent.putExtra(KEY_VPN_PROFILE, (Parcelable) profile);
-        startActivityForResult(intent, REQUEST_ADD_OR_EDIT_PROFILE);
+        Bundle args = new Bundle();
+        args.putParcelable(KEY_VPN_PROFILE, profile);
+        startFragment(this, VpnEditor.class.getCanonicalName(),
+                REQUEST_ADD_OR_EDIT_PROFILE, args);
     }
 
     private synchronized void connect(final VpnProfile p) {
@@ -714,7 +729,7 @@
 
         case CONNECTING:
             mConnectingActor = getActor(p);
-            // pass through
+            // $FALL-THROUGH$
         case DISCONNECTING:
             mActiveProfile = p;
             disableProfilePreferencesIfOneActive();
@@ -810,11 +825,6 @@
             public int compare(VpnProfile p1, VpnProfile p2) {
                 return p1.getName().compareTo(p2.getName());
             }
-
-            public boolean equals(VpnProfile p) {
-                // not used
-                return false;
-            }
         });
         for (VpnProfile p : mVpnProfileList) {
             Preference pref = addPreferenceFor(p, false);
@@ -855,20 +865,21 @@
     }
 
     private String getProfileSummaryString(VpnProfile p) {
+        final Activity activity = getActivity();
         switch (p.getState()) {
         case CONNECTING:
-            return getString(R.string.vpn_connecting);
+            return activity.getString(R.string.vpn_connecting);
         case DISCONNECTING:
-            return getString(R.string.vpn_disconnecting);
+            return activity.getString(R.string.vpn_disconnecting);
         case CONNECTED:
-            return getString(R.string.vpn_connected);
+            return activity.getString(R.string.vpn_connected);
         default:
-            return getString(R.string.vpn_connect_hint);
+            return activity.getString(R.string.vpn_connect_hint);
         }
     }
 
     private VpnProfileActor getActor(VpnProfile p) {
-        return new AuthenticationActor(this, p);
+        return new AuthenticationActor(getActivity(), p);
     }
 
     private VpnProfile createVpnProfile(String type) {
@@ -938,8 +949,7 @@
                     Log.e(TAG, "keystore write failed: key=" + key);
                 }
                 pskProfile.setPresharedKey(key);
-                // pass through
-
+                // $FALL-THROUGH$
             case L2TP_IPSEC:
             case L2TP:
                 L2tpProfile l2tpProfile = (L2tpProfile) p;
@@ -1007,8 +1017,6 @@
 
     // managing status check in a background thread
     private class StatusChecker {
-        private List<VpnProfile> mList;
-
         synchronized void check(final List<VpnProfile> list) {
             final ConditionVariable cv = new ConditionVariable();
             cv.close();
@@ -1027,7 +1035,7 @@
                             changeState(p, VpnState.IDLE);
                         }
                     }
-                    VpnSettings.this.unbindService(this);
+                    getActivity().unbindService(this);
                     showPreferences();
                 }
 
@@ -1035,7 +1043,7 @@
                     cv.open();
 
                     setDefaultState(list);
-                    VpnSettings.this.unbindService(this);
+                    getActivity().unbindService(this);
                     showPreferences();
                 }
             };
diff --git a/src/com/android/settings/vpn/VpnTypeSelection.java b/src/com/android/settings/vpn/VpnTypeSelection.java
index aa4bc5e..5990ac0 100644
--- a/src/com/android/settings/vpn/VpnTypeSelection.java
+++ b/src/com/android/settings/vpn/VpnTypeSelection.java
@@ -17,13 +17,14 @@
 package com.android.settings.vpn;
 
 import com.android.settings.R;
+import com.android.settings.SettingsPreferenceFragment;
 
+import android.app.Activity;
 import android.content.Intent;
 import android.net.vpn.VpnManager;
 import android.net.vpn.VpnType;
 import android.os.Bundle;
 import android.preference.Preference;
-import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 
 import java.util.HashMap;
@@ -32,7 +33,7 @@
 /**
  * The activity to select a VPN type.
  */
-public class VpnTypeSelection extends PreferenceActivity {
+public class VpnTypeSelection extends SettingsPreferenceFragment {
     private Map<String, VpnType> mTypeMap = new HashMap<String, VpnType>();
 
     @Override
@@ -46,19 +47,20 @@
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen ps, Preference pref) {
         setResult(mTypeMap.get(pref.getTitle().toString()));
-        finish();
+        finishFragment();
         return true;
     }
 
     private void initTypeList() {
         PreferenceScreen root = getPreferenceScreen();
+        final Activity activity = getActivity();
         for (VpnType t : VpnManager.getSupportedVpnTypes()) {
             String displayName = t.getDisplayName();
             String message = String.format(
-                    getString(R.string.vpn_edit_title_add), displayName);
+                    activity.getString(R.string.vpn_edit_title_add), displayName);
             mTypeMap.put(message, t);
 
-            Preference pref = new Preference(this);
+            Preference pref = new Preference(activity);
             pref.setTitle(message);
             pref.setSummary(t.getDescriptionId());
             root.addPreference(pref);
@@ -66,8 +68,8 @@
     }
 
     private void setResult(VpnType type) {
-        Intent intent = new Intent(this, VpnSettings.class);
+        Intent intent = new Intent(getActivity(), VpnSettings.class);
         intent.putExtra(VpnSettings.KEY_VPN_TYPE, type.toString());
-        setResult(RESULT_OK, intent);
+        setResult(Activity.RESULT_OK, intent);
     }
 }
diff --git a/src/com/android/settings/wifi/AdvancedSettings.java b/src/com/android/settings/wifi/AdvancedSettings.java
index 636e1df..4b33fdc 100644
--- a/src/com/android/settings/wifi/AdvancedSettings.java
+++ b/src/com/android/settings/wifi/AdvancedSettings.java
@@ -18,21 +18,14 @@
 
 import com.android.settings.R;
 
-import android.content.ContentResolver;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.preference.CheckBoxPreference;
-import android.preference.EditTextPreference;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
 import android.provider.Settings;
-import android.provider.Settings.System;
 import android.text.TextUtils;
-import android.view.KeyEvent;
-import android.view.Menu;
-import android.view.MenuItem;
 import android.widget.Toast;
 import android.os.SystemProperties;
 
@@ -41,24 +34,9 @@
 
     private static final String KEY_MAC_ADDRESS = "mac_address";
     private static final String KEY_CURRENT_IP_ADDRESS = "current_ip_address";
-    private static final String KEY_USE_STATIC_IP = "use_static_ip";
     private static final String KEY_NUM_CHANNELS = "num_channels";
     private static final String KEY_SLEEP_POLICY = "sleep_policy";
     
-    private String[] mSettingNames = {
-            System.WIFI_STATIC_IP, System.WIFI_STATIC_GATEWAY, System.WIFI_STATIC_NETMASK,
-            System.WIFI_STATIC_DNS1, System.WIFI_STATIC_DNS2
-    };
-    
-    private String[] mPreferenceKeys = {
-            "ip_address", "gateway", "netmask", "dns1", "dns2"
-    };
-    
-    private CheckBoxPreference mUseStaticIpCheckBox;
-    
-    private static final int MENU_ITEM_SAVE = Menu.FIRST;
-    private static final int MENU_ITEM_CANCEL = Menu.FIRST + 1;
-    
     //Tracks ro.debuggable (1 on userdebug builds)
     private static int DEBUGGABLE;
 
@@ -68,14 +46,6 @@
         
         addPreferencesFromResource(R.xml.wifi_advanced_settings);
         
-        mUseStaticIpCheckBox = (CheckBoxPreference) findPreference(KEY_USE_STATIC_IP);
-        mUseStaticIpCheckBox.setOnPreferenceChangeListener(this);
-
-        for (int i = 0; i < mPreferenceKeys.length; i++) {
-            Preference preference = findPreference(mPreferenceKeys[i]);
-            preference.setOnPreferenceChangeListener(this);
-        }
-
         DEBUGGABLE = SystemProperties.getInt("ro.debuggable", 0);
 
         /**
@@ -101,7 +71,6 @@
     protected void onResume() {
         super.onResume();
         
-        updateUi();
         /**
          * Remove user control of regulatory domain
          * channel count settings in non userdebug builds
@@ -155,16 +124,6 @@
         pref.setValue(String.valueOf(value));
     }
 
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-    
-        if (keyCode == KeyEvent.KEYCODE_BACK) {
-            updateSettingsProvider();
-        }
-    
-        return super.onKeyDown(keyCode, event);
-    }
-
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         String key = preference.getKey();
         if (key == null) return true;
@@ -193,121 +152,11 @@
                 return false;
             }
 
-        } else if (key.equals(KEY_USE_STATIC_IP)) {
-            boolean value = ((Boolean) newValue).booleanValue();
-
-            try {
-                Settings.System.putInt(getContentResolver(),
-                        Settings.System.WIFI_USE_STATIC_IP, value ? 1 : 0);
-            } catch (NumberFormatException e) {
-                return false;
-            }
-        } else {
-            String value = (String) newValue;
-            
-            if (!isIpAddress(value)) {
-                Toast.makeText(this, R.string.wifi_ip_settings_invalid_ip, Toast.LENGTH_LONG).show();
-                return false;
-            }
-            
-            preference.setSummary(value);
-            for (int i = 0; i < mSettingNames.length; i++) {
-                if (key.equals(mPreferenceKeys[i])) {
-                    Settings.System.putString(getContentResolver(), mSettingNames[i], value);
-                    break;
-                }
-            }
         }
         
         return true;
     }
 
-    private boolean isIpAddress(String value) {
-        
-        int start = 0;
-        int end = value.indexOf('.');
-        int numBlocks = 0;
-        
-        while (start < value.length()) {
-            
-            if (end == -1) {
-                end = value.length();
-            }
-
-            try {
-                int block = Integer.parseInt(value.substring(start, end));
-                if ((block > 255) || (block < 0)) {
-                    return false;
-                }
-            } catch (NumberFormatException e) {
-                return false;
-            }
-            
-            numBlocks++;
-            
-            start = end + 1;
-            end = value.indexOf('.', start);
-        }
-        
-        return numBlocks == 4;
-    }
-    
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        
-        menu.add(0, MENU_ITEM_SAVE, 0, R.string.wifi_ip_settings_menu_save)
-                .setIcon(android.R.drawable.ic_menu_save);
-
-        menu.add(0, MENU_ITEM_CANCEL, 0, R.string.wifi_ip_settings_menu_cancel)
-                .setIcon(android.R.drawable.ic_menu_close_clear_cancel);
-
-        return super.onCreateOptionsMenu(menu);
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-
-        switch (item.getItemId()) {
-        
-            case MENU_ITEM_SAVE:
-                updateSettingsProvider();
-                finish();
-                return true;
-                
-            case MENU_ITEM_CANCEL:
-                finish();
-                return true;
-        }
-        
-        return super.onOptionsItemSelected(item);
-    }
-
-    private void updateUi() {
-        ContentResolver contentResolver = getContentResolver();
-        
-        mUseStaticIpCheckBox.setChecked(System.getInt(contentResolver,
-                System.WIFI_USE_STATIC_IP, 0) != 0);
-        
-        for (int i = 0; i < mSettingNames.length; i++) {
-            EditTextPreference preference = (EditTextPreference) findPreference(mPreferenceKeys[i]);
-            String settingValue = System.getString(contentResolver, mSettingNames[i]);
-            preference.setText(settingValue);
-            preference.setSummary(settingValue);
-        }
-    }
-    
-    private void updateSettingsProvider() {
-        ContentResolver contentResolver = getContentResolver();
-
-        System.putInt(contentResolver, System.WIFI_USE_STATIC_IP,
-                mUseStaticIpCheckBox.isChecked() ? 1 : 0);
-        
-        for (int i = 0; i < mSettingNames.length; i++) {
-            EditTextPreference preference = (EditTextPreference) findPreference(mPreferenceKeys[i]);
-            System.putString(contentResolver, mSettingNames[i], preference.getText());
-        }
-    }
-    
     private void refreshWifiInfo() {
         WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
         WifiInfo wifiInfo = wifiManager.getConnectionInfo();
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index f662acb..a09bfa3 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -19,8 +19,10 @@
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.res.Resources;
+import android.net.DhcpInfo;
 import android.net.NetworkInfo.DetailedState;
 import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiConfiguration.IpAssignment;
 import android.net.wifi.WifiConfiguration.AuthAlgorithm;
 import android.net.wifi.WifiConfiguration.KeyMgmt;
 import android.net.wifi.WifiInfo;
@@ -37,8 +39,10 @@
 import android.widget.CheckBox;
 import android.widget.Spinner;
 import android.widget.TextView;
+import android.widget.Toast;
 
 import com.android.settings.R;
+import java.net.UnknownHostException;
 
 /**
  * The class for allowing UIs like {@link WifiDialog} and {@link WifiConfigPreference} to
@@ -54,18 +58,27 @@
 
     private boolean mEdit;
 
-    private TextView mSsid;
+    private TextView mSsidView;
 
     // e.g. AccessPoint.SECURITY_NONE
-    private int mSecurityType;
+    private int mAccessPointSecurity;
     private TextView mPasswordView;
 
-    private Spinner mEapMethod;
-    private Spinner mEapCaCert;
-    private Spinner mPhase2;
-    private Spinner mEapUserCert;
-    private TextView mEapIdentity;
-    private TextView mEapAnonymous;
+    private Spinner mSecuritySpinner;
+    private Spinner mEapMethodSpinner;
+    private Spinner mEapCaCertSpinner;
+    private Spinner mPhase2Spinner;
+    private Spinner mEapUserCertSpinner;
+    private TextView mEapIdentityView;
+    private TextView mEapAnonymousView;
+
+    private static final String STATIC_IP = "Static";
+    private Spinner mIpSettingsSpinner;
+    private TextView mIpAddressView;
+    private TextView mGatewayView;
+    private TextView mNetmaskView;
+    private TextView mDns1View;
+    private TextView mDns2View;
 
     static boolean requireKeyStore(WifiConfiguration config) {
         String values[] = {config.ca_cert.value(), config.client_cert.value(),
@@ -84,7 +97,8 @@
 
         mView = view;
         mAccessPoint = accessPoint;
-        mSecurityType = (accessPoint == null) ? AccessPoint.SECURITY_NONE : accessPoint.security;
+        mAccessPointSecurity = (accessPoint == null) ? AccessPoint.SECURITY_NONE :
+                accessPoint.security;
         mEdit = edit;
 
         final Context context = mConfigUi.getContext();
@@ -93,10 +107,10 @@
         if (mAccessPoint == null) {
             mConfigUi.setTitle(R.string.wifi_add_network);
             mView.findViewById(R.id.type).setVisibility(View.VISIBLE);
-            mSsid = (TextView) mView.findViewById(R.id.ssid);
-            mSsid.addTextChangedListener(this);
-            ((Spinner) mView.findViewById(R.id.security)).setOnItemSelectedListener(this);
-
+            mSsidView = (TextView) mView.findViewById(R.id.ssid);
+            mSsidView.addTextChangedListener(this);
+            mSecuritySpinner = ((Spinner) mView.findViewById(R.id.security));
+            mSecuritySpinner.setOnItemSelectedListener(this);
             mConfigUi.setSubmitButton(context.getString(R.string.wifi_save));
         } else {
             mConfigUi.setTitle(mAccessPoint.ssid);
@@ -128,6 +142,7 @@
 
             if (mAccessPoint.networkId == -1 || mEdit) {
                 showSecurityFields();
+                showIpConfigFields();
             }
 
             if (mEdit) {
@@ -135,6 +150,8 @@
             } else {
                 if (state == null && level != -1) {
                     mConfigUi.setSubmitButton(context.getString(R.string.wifi_connect));
+                } else {
+                    mView.findViewById(R.id.ipfields).setVisibility(View.GONE);
                 }
                 if (mAccessPoint.networkId != -1) {
                     mConfigUi.setForgetButton(context.getString(R.string.wifi_forget));
@@ -142,6 +159,15 @@
             }
         }
 
+        mIpSettingsSpinner = ((Spinner) mView.findViewById(R.id.ipsettings));
+        if (mAccessPoint != null && mAccessPoint.networkId != -1) {
+            WifiConfiguration config = mAccessPoint.getConfig();
+            if (config.ipAssignment == IpAssignment.STATIC) {
+                setSelection(mIpSettingsSpinner, STATIC_IP);
+            }
+        }
+        mIpSettingsSpinner.setOnItemSelectedListener(this);
+
         mConfigUi.setCancelButton(context.getString(R.string.wifi_cancel));
         if (mConfigUi.getSubmitButton() != null) {
             enableSubmitIfAppropriate();
@@ -155,12 +181,12 @@
         group.addView(row);
     }
 
+    /* show submit button if the password is valid */
     private void enableSubmitIfAppropriate() {
-        // TODO: make sure this is complete.
-        if ((mSsid != null && mSsid.length() == 0) ||
-                ((mAccessPoint == null || mAccessPoint.networkId == -1) &&
-                ((mSecurityType == AccessPoint.SECURITY_WEP && mPasswordView.length() == 0) ||
-                (mSecurityType == AccessPoint.SECURITY_PSK && mPasswordView.length() < 8)))) {
+        if ((mSsidView != null && mSsidView.length() == 0) ||
+            ((mAccessPoint == null || mAccessPoint.networkId == -1) &&
+            ((mAccessPointSecurity == AccessPoint.SECURITY_WEP && mPasswordView.length() == 0) ||
+            (mAccessPointSecurity == AccessPoint.SECURITY_PSK && mPasswordView.length() < 8)))) {
             mConfigUi.getSubmitButton().setEnabled(false);
         } else {
             mConfigUi.getSubmitButton().setEnabled(true);
@@ -176,7 +202,7 @@
 
         if (mAccessPoint == null) {
             config.SSID = AccessPoint.convertToQuotedString(
-                    mSsid.getText().toString());
+                    mSsidView.getText().toString());
             // If the user adds a network manually, assume that it is hidden.
             config.hiddenSSID = true;
         } else if (mAccessPoint.networkId == -1) {
@@ -186,10 +212,10 @@
             config.networkId = mAccessPoint.networkId;
         }
 
-        switch (mSecurityType) {
+        switch (mAccessPointSecurity) {
             case AccessPoint.SECURITY_NONE:
                 config.allowedKeyManagement.set(KeyMgmt.NONE);
-                return config;
+                break;
 
             case AccessPoint.SECURITY_WEP:
                 config.allowedKeyManagement.set(KeyMgmt.NONE);
@@ -206,7 +232,7 @@
                         config.wepKeys[0] = '"' + password + '"';
                     }
                 }
-                return config;
+                break;
 
             case AccessPoint.SECURITY_PSK:
                 config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
@@ -218,38 +244,63 @@
                         config.preSharedKey = '"' + password + '"';
                     }
                 }
-                return config;
+                break;
 
             case AccessPoint.SECURITY_EAP:
                 config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
                 config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
-                config.eap.setValue((String) mEapMethod.getSelectedItem());
+                config.eap.setValue((String) mEapMethodSpinner.getSelectedItem());
 
-                config.phase2.setValue((mPhase2.getSelectedItemPosition() == 0) ? "" :
-                        "auth=" + mPhase2.getSelectedItem());
-                config.ca_cert.setValue((mEapCaCert.getSelectedItemPosition() == 0) ? "" :
+                config.phase2.setValue((mPhase2Spinner.getSelectedItemPosition() == 0) ? "" :
+                        "auth=" + mPhase2Spinner.getSelectedItem());
+                config.ca_cert.setValue((mEapCaCertSpinner.getSelectedItemPosition() == 0) ? "" :
                         KEYSTORE_SPACE + Credentials.CA_CERTIFICATE +
-                        (String) mEapCaCert.getSelectedItem());
-                config.client_cert.setValue((mEapUserCert.getSelectedItemPosition() == 0) ? "" :
-                        KEYSTORE_SPACE + Credentials.USER_CERTIFICATE +
-                        (String) mEapUserCert.getSelectedItem());
-                config.private_key.setValue((mEapUserCert.getSelectedItemPosition() == 0) ? "" :
-                        KEYSTORE_SPACE + Credentials.USER_PRIVATE_KEY +
-                        (String) mEapUserCert.getSelectedItem());
-                config.identity.setValue((mEapIdentity.length() == 0) ? "" :
-                        mEapIdentity.getText().toString());
-                config.anonymous_identity.setValue((mEapAnonymous.length() == 0) ? "" :
-                        mEapAnonymous.getText().toString());
+                        (String) mEapCaCertSpinner.getSelectedItem());
+                config.client_cert.setValue((mEapUserCertSpinner.getSelectedItemPosition() == 0) ?
+                        "" : KEYSTORE_SPACE + Credentials.USER_CERTIFICATE +
+                        (String) mEapUserCertSpinner.getSelectedItem());
+                config.private_key.setValue((mEapUserCertSpinner.getSelectedItemPosition() == 0) ?
+                        "" : KEYSTORE_SPACE + Credentials.USER_PRIVATE_KEY +
+                        (String) mEapUserCertSpinner.getSelectedItem());
+                config.identity.setValue((mEapIdentityView.length() == 0) ? "" :
+                        mEapIdentityView.getText().toString());
+                config.anonymous_identity.setValue((mEapAnonymousView.length() == 0) ? "" :
+                        mEapAnonymousView.getText().toString());
                 if (mPasswordView.length() != 0) {
                     config.password.setValue(mPasswordView.getText().toString());
                 }
-                return config;
+                break;
+
+            default:
+                    return null;
         }
-        return null;
+
+        config.ipAssignment = mIpSettingsSpinner.getSelectedItem().toString().equals(STATIC_IP) ?
+                IpAssignment.STATIC : IpAssignment.DHCP;
+
+        if (config.ipAssignment == IpAssignment.STATIC) {
+            //TODO: A better way to do this is to not dismiss the
+            //dialog as long as one of the fields is invalid
+            try {
+                config.ipConfig.ipAddress = stringToIpAddr(mIpAddressView.getText().toString());
+                config.ipConfig.gateway = stringToIpAddr(mGatewayView.getText().toString());
+                config.ipConfig.netmask = stringToIpAddr(mNetmaskView.getText().toString());
+                config.ipConfig.dns1 = stringToIpAddr(mDns1View.getText().toString());
+                if (mDns2View.getText() != null && mDns2View.getText().length() > 0) {
+                    config.ipConfig.dns2 = stringToIpAddr(mDns2View.getText().toString());
+                }
+            } catch (UnknownHostException e) {
+                Toast.makeText(mConfigUi.getContext(), R.string.wifi_ip_settings_invalid_ip,
+                        Toast.LENGTH_LONG).show();
+                return null;
+            }
+        }
+
+        return config;
     }
 
     private void showSecurityFields() {
-        if (mSecurityType == AccessPoint.SECURITY_NONE) {
+        if (mAccessPointSecurity == AccessPoint.SECURITY_NONE) {
             mView.findViewById(R.id.fields).setVisibility(View.GONE);
             return;
         }
@@ -265,37 +316,75 @@
             }
         }
 
-        if (mSecurityType != AccessPoint.SECURITY_EAP) {
+        if (mAccessPointSecurity != AccessPoint.SECURITY_EAP) {
             mView.findViewById(R.id.eap).setVisibility(View.GONE);
             return;
         }
         mView.findViewById(R.id.eap).setVisibility(View.VISIBLE);
 
-        if (mEapMethod == null) {
-            mEapMethod = (Spinner) mView.findViewById(R.id.method);
-            mPhase2 = (Spinner) mView.findViewById(R.id.phase2);
-            mEapCaCert = (Spinner) mView.findViewById(R.id.ca_cert);
-            mEapUserCert = (Spinner) mView.findViewById(R.id.user_cert);
-            mEapIdentity = (TextView) mView.findViewById(R.id.identity);
-            mEapAnonymous = (TextView) mView.findViewById(R.id.anonymous);
+        if (mEapMethodSpinner == null) {
+            mEapMethodSpinner = (Spinner) mView.findViewById(R.id.method);
+            mPhase2Spinner = (Spinner) mView.findViewById(R.id.phase2);
+            mEapCaCertSpinner = (Spinner) mView.findViewById(R.id.ca_cert);
+            mEapUserCertSpinner = (Spinner) mView.findViewById(R.id.user_cert);
+            mEapIdentityView = (TextView) mView.findViewById(R.id.identity);
+            mEapAnonymousView = (TextView) mView.findViewById(R.id.anonymous);
 
-            loadCertificates(mEapCaCert, Credentials.CA_CERTIFICATE);
-            loadCertificates(mEapUserCert, Credentials.USER_PRIVATE_KEY);
+            loadCertificates(mEapCaCertSpinner, Credentials.CA_CERTIFICATE);
+            loadCertificates(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY);
 
             if (mAccessPoint != null && mAccessPoint.networkId != -1) {
                 WifiConfiguration config = mAccessPoint.getConfig();
-                setSelection(mEapMethod, config.eap.value());
-                setSelection(mPhase2, config.phase2.value());
-                setCertificate(mEapCaCert, Credentials.CA_CERTIFICATE,
+                setSelection(mEapMethodSpinner, config.eap.value());
+                setSelection(mPhase2Spinner, config.phase2.value());
+                setCertificate(mEapCaCertSpinner, Credentials.CA_CERTIFICATE,
                         config.ca_cert.value());
-                setCertificate(mEapUserCert, Credentials.USER_PRIVATE_KEY,
+                setCertificate(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY,
                         config.private_key.value());
-                mEapIdentity.setText(config.identity.value());
-                mEapAnonymous.setText(config.anonymous_identity.value());
+                mEapIdentityView.setText(config.identity.value());
+                mEapAnonymousView.setText(config.anonymous_identity.value());
             }
         }
     }
 
+    private void showIpConfigFields() {
+        WifiConfiguration config = null;
+
+        mView.findViewById(R.id.ipfields).setVisibility(View.VISIBLE);
+
+        if (mIpSettingsSpinner == null) {
+            mIpSettingsSpinner = (Spinner) mView.findViewById(R.id.ipsettings);
+        }
+
+        if (mAccessPoint != null && mAccessPoint.networkId != -1) {
+            config = mAccessPoint.getConfig();
+        }
+
+        if (mIpSettingsSpinner.getSelectedItem().equals(STATIC_IP)) {
+            mView.findViewById(R.id.staticip).setVisibility(View.VISIBLE);
+            if (mIpAddressView == null) {
+                mIpAddressView = (TextView) mView.findViewById(R.id.ipaddress);
+                mGatewayView = (TextView) mView.findViewById(R.id.gateway);
+                mNetmaskView = (TextView) mView.findViewById(R.id.netmask);
+                mDns1View = (TextView) mView.findViewById(R.id.dns1);
+                mDns2View = (TextView) mView.findViewById(R.id.dns2);
+            }
+            if (config != null) {
+                DhcpInfo ipConfig = config.ipConfig;
+                if (ipConfig != null && ipConfig.ipAddress != 0) {
+                    mIpAddressView.setText(intToIpString(ipConfig.ipAddress));
+                    mGatewayView.setText(intToIpString(ipConfig.gateway));
+                    mNetmaskView.setText(intToIpString(ipConfig.netmask));
+                    mDns1View.setText(intToIpString(ipConfig.dns1));
+                    mDns2View.setText(intToIpString(ipConfig.dns2));
+                }
+            }
+        } else {
+            mView.findViewById(R.id.staticip).setVisibility(View.GONE);
+        }
+    }
+
+
     private void loadCertificates(Spinner spinner, String prefix) {
         final Context context = mConfigUi.getContext();
         final String unspecified = context.getString(R.string.wifi_unspecified);
@@ -358,12 +447,41 @@
 
     @Override
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
-        mSecurityType = position;
-        showSecurityFields();
-        enableSubmitIfAppropriate();
+        if (view == mSecuritySpinner) {
+            mAccessPointSecurity = position;
+            showSecurityFields();
+            enableSubmitIfAppropriate();
+        } else {
+            showIpConfigFields();
+        }
     }
 
     @Override
     public void onNothingSelected(AdapterView<?> parent) {
     }
+
+    /* TODO: should go away when we move to IPv6 based config storage */
+    private static int stringToIpAddr(String addrString) throws UnknownHostException {
+        try {
+            String[] parts = addrString.split("\\.");
+            if (parts.length != 4) {
+                throw new UnknownHostException(addrString);
+            }
+
+            int a = Integer.parseInt(parts[0]);
+            int b = Integer.parseInt(parts[1]) << 8;
+            int c = Integer.parseInt(parts[2]) << 16;
+            int d = Integer.parseInt(parts[3]) << 24;
+
+            return a | b | c | d;
+        } catch (NumberFormatException e) {
+            throw new UnknownHostException(addrString);
+        }
+    }
+
+    private static String intToIpString(int i) {
+        return (i & 0xFF) + "." + ((i >>  8 ) & 0xFF) + "." +((i >> 16 ) & 0xFF) + "." +
+            ((i >> 24 ) & 0xFF);
+    }
+
 }
\ No newline at end of file
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 4bf11e4..905f2a3 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -288,9 +288,7 @@
                 }
                 if (mSelectedAccessPoint.networkId != -1) {
                     menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
-                    if (mSelectedAccessPoint.security != AccessPoint.SECURITY_NONE) {
-                        menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
-                    }
+                    menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
                 }
             }
         }
@@ -669,4 +667,12 @@
         mSelectedAccessPoint = null;
         showConfigUi(null, true);
     }
+
+    /* package */ int getAccessPointsCount() {
+        if (mAccessPoints != null) {
+            return mAccessPoints.getPreferenceCount();
+        } else {
+            return 0;
+        }
+    }
 }
diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
index 2d26645..ef827f6 100644
--- a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
+++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java
@@ -40,7 +40,7 @@
 
     static {
         stateMap.put(DetailedState.IDLE, DetailedState.DISCONNECTED);
-        stateMap.put(DetailedState.SCANNING, DetailedState.DISCONNECTED);
+        stateMap.put(DetailedState.SCANNING, DetailedState.SCANNING);
         stateMap.put(DetailedState.CONNECTING, DetailedState.CONNECTING);
         stateMap.put(DetailedState.AUTHENTICATING, DetailedState.CONNECTING);
         stateMap.put(DetailedState.OBTAINING_IPADDR, DetailedState.CONNECTING);
@@ -111,28 +111,40 @@
 
     public void updateConnectionState(DetailedState originalState) {
         final DetailedState state = stateMap.get(originalState);
-        final String message;
-        mProgressBar.setIndeterminate(false);
         switch (state) {
+        case SCANNING: {
+            // Let users know the device is working correctly though currently there's
+            // no visible network on the list.
+            if (mWifiSettings.getAccessPointsCount() == 0) {
+                mProgressBar.setIndeterminate(true);
+                mProgressText.setText(Summary.get(this, DetailedState.SCANNING));
+            } else {
+                // Users already already connected to a network, or see available networks.
+                mProgressBar.setIndeterminate(false);
+            }
+            break;
+        }
         case CONNECTING: {
-            message = Summary.get(this, state);
+            mProgressBar.setIndeterminate(false);
             mProgressBar.setProgress(1);
             mStatusText.setText(R.string.wifi_setup_status_connecting);
+            mProgressText.setText(Summary.get(this, state));
             break;
         }
         case CONNECTED: {
-            message = Summary.get(this, state);
+            mProgressBar.setIndeterminate(false);
             mProgressBar.setProgress(2);
             mStatusText.setText(R.string.wifi_setup_status_connected);
+            mProgressText.setText(Summary.get(this, state));
             break;
         }
         default:  // Not connected.
-            message = getString(R.string.wifi_setup_not_connected);
+            mProgressBar.setIndeterminate(false);
             mProgressBar.setProgress(0);
             mStatusText.setText(R.string.wifi_setup_status_select_network);
+            mProgressText.setText(getString(R.string.wifi_setup_not_connected));
             break;
         }
-        mProgressText.setText(message);
     }
 
     public void onWifiConfigPreferenceAttached(boolean isNewNetwork) {
