diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 15dc279..1b80ce8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -301,6 +301,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <action android:name="android.settings.INPUT_METHOD_SETTINGS" />
+                <action android:name="com.android.settings.VOICE_INPUT_OUTPUT_SETTINGS" />
                 <category android:name="android.intent.category.VOICE_LAUNCH" />
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="com.android.settings.SHORTCUT" />
@@ -631,21 +632,6 @@
                 android:resource="@id/accessibility_settings" />
         </activity>
 
-        <activity android:name="Settings$VoiceInputOutputSettingsActivity"
-                android:theme="@android:style/Theme.Holo"
-                android:label="@string/voice_input_output_settings"
-                android:targetActivity="Settings">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <action android:name="com.android.settings.VOICE_INPUT_OUTPUT_SETTINGS" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
-                android:value="com.android.settings.VoiceInputOutputSettings" />
-            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
-                android:resource="@id/voice_input_output_settings" />
-        </activity>
-
         <activity android:name="TextToSpeechSettings" android:label="@string/tts_settings">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 8c94635..8bc4139 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -2181,7 +2181,7 @@
 
     <!-- Language Settings --> <skip />
     <!-- Title of setting on main settings screen.  This item will take the user to the screen to tweak settings realted to locale and text -->
-    <string name="language_settings">Language &amp; keyboard</string>
+    <string name="language_settings">Language &amp; input</string>
     <!-- Title of Language and keyboard settings screen -->
     <string name="language_keyboard_settings_title">Language &amp; keyboard settings</string>
     <!-- On Language & keyboard settings screen, heading. Inside the "Language & keyboard settings" screen, this is the header for settings that relate to language (select the system language, user dictionary for the language). -->
diff --git a/res/xml/language_settings.xml b/res/xml/language_settings.xml
index 2037fc7..3afe861 100644
--- a/res/xml/language_settings.xml
+++ b/res/xml/language_settings.xml
@@ -33,6 +33,28 @@
         android:summary="@string/user_dict_settings_summary">
     </PreferenceScreen>
 
+    <PreferenceCategory android:key="voice_input_category"
+            android:title="@string/voice_input_category" >
+
+        <!-- entries, entryValues, and defaultValue will be populated programmatically. -->
+        <ListPreference
+                android:key="recognizer"
+                android:title="@string/recognizer_title"
+                android:dialogTitle="@string/recognizer_title" />
+
+        <!-- An intent for this preference will be populated programmatically. -->
+        <PreferenceScreen android:key="recognizer_settings"
+                android:title="@string/recognizer_settings_title" />
+    </PreferenceCategory>
+
+    <PreferenceCategory android:key="voice_output_category"
+            android:title="@string/voice_output_category" >
+
+        <PreferenceScreen android:key="tts_settings"
+                android:fragment="com.android.settings.TextToSpeechSettings"
+                android:title="@string/tts_settings_title" />
+    </PreferenceCategory>
+
     <PreferenceCategory android:key="keyboard_settings_category"
             android:title="@string/keyboard_settings_category">
 
diff --git a/res/xml/settings_headers.xml b/res/xml/settings_headers.xml
index 25f9368..5411308 100644
--- a/res/xml/settings_headers.xml
+++ b/res/xml/settings_headers.xml
@@ -119,14 +119,6 @@
         android:icon="@drawable/ic_settings_language"
         android:title="@string/language_settings" />
 
-    <!-- Voice input & output -->
-
-    <header
-        android:id="@+id/voice_input_output_settings"
-        android:fragment="com.android.settings.VoiceInputOutputSettings"
-        android:icon="@drawable/ic_settings_speech"
-        android:title="@string/voice_input_output_settings" />
-
     <!-- Accessibility feedback -->
 
     <header
diff --git a/res/xml/voice_input_output_settings.xml b/res/xml/voice_input_output_settings.xml
deleted file mode 100644
index 1645d88..0000000
--- a/res/xml/voice_input_output_settings.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2010 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-  
-          http://www.apache.org/licenses/LICENSE-2.0
-  
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-
-<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
-        android:title="@string/voice_input_output_settings_title"
-        android:key="parent">
-
-    <PreferenceCategory android:key="voice_input_category"
-            android:title="@string/voice_input_category" />
-    
-    <!-- entries, entryValues, and defaultValue will be populated programmatically. -->
-    <ListPreference
-            android:key="recognizer"
-            android:title="@string/recognizer_title"
-            android:dialogTitle="@string/recognizer_title" />
-
-    <!-- An intent for this preference will be populated programmatically. -->
-    <PreferenceScreen android:key="recognizer_settings"
-            android:title="@string/recognizer_settings_title" />
-
-    <PreferenceCategory android:key="voice_output_category"
-            android:title="@string/voice_output_category" />
-
-    <PreferenceScreen android:key="tts_settings"
-            android:fragment="com.android.settings.TextToSpeechSettings"
-            android:title="@string/tts_settings_title" />
-
-</PreferenceScreen>
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index f0c2b02..6cc5508 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -21,10 +21,7 @@
 import android.app.Service;
 import android.content.DialogInterface;
 import android.content.Intent;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.content.pm.PackageManager.NameNotFoundException;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.SystemProperties;
@@ -51,7 +48,7 @@
     private static final String DEFAULT_SCREENREADER_MARKET_LINK =
         "market://search?q=pname:com.google.android.marvin.talkback";
 
-    private final String TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
+    private final String TOGGLE_ACCESSIBILITY_CHECKBOX =
         "toggle_accessibility_service_checkbox";
 
     private static final String ACCESSIBILITY_SERVICES_CATEGORY =
@@ -63,9 +60,12 @@
     private static final String POWER_BUTTON_CATEGORY =
         "power_button_category";
 
-    private final String POWER_BUTTON_ENDS_CALL_CHECKBOX =
+    private static final String POWER_BUTTON_ENDS_CALL_CHECKBOX =
         "power_button_ends_call";
 
+    private final String KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX =
+        "key_toggle_accessibility_service_checkbox";
+
     private static final int DIALOG_ID_DISABLE_ACCESSIBILITY = 1;
     private static final int DIALOG_ID_ENABLE_SCRIPT_INJECTION = 2;
     private static final int DIALOG_ID_ENABLE_ACCESSIBILITY_SERVICE = 3;
@@ -96,7 +96,7 @@
             (PreferenceGroup) findPreference(ACCESSIBILITY_SERVICES_CATEGORY);
 
         mToggleAccessibilityCheckBox = (CheckBoxPreference) findPreference(
-                TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX);
+                TOGGLE_ACCESSIBILITY_CHECKBOX);
 
         mToggleScriptInjectionCheckBox = (CheckBoxPreference) findPreference(
                 TOGGLE_ACCESSIBILITY_SCRIPT_INJECTION_CHECKBOX);
@@ -131,16 +131,7 @@
     }
 
     @Override
-    public void onPause() {
-        super.onPause();
-
-        persistEnabledAccessibilityServices();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-
+    public void onActivityCreated(Bundle savedInstanceState) {
         addAccessibilitServicePreferences();
 
         final HashSet<String> enabled = new HashSet<String>();
@@ -169,6 +160,9 @@
         if (!accessibilityServices.isEmpty()) {
             if (serviceState == 1) {
                 mToggleAccessibilityCheckBox.setChecked(true);
+                if (savedInstanceState != null) {
+                    restoreInstanceStrate(savedInstanceState);
+                }
             } else {
                 setAccessibilityServicePreferencesState(false);
             }
@@ -182,7 +176,41 @@
             mToggleAccessibilityCheckBox.setEnabled(false);
             // Notify user that they do not have any accessibility apps
             // installed and direct them to Market to get TalkBack
-            displayNoAppsAlert();
+            showDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
+        }
+
+        super.onActivityCreated(savedInstanceState);
+    }
+
+    @Override
+    public void onPause() {
+        super.onPause();
+
+        persistEnabledAccessibilityServices();
+    }
+
+    @Override
+    public void onSaveInstanceState(Bundle outState) {
+        if (mToggleAccessibilityServiceCheckBox != null) {
+            outState.putString(KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX,
+                    mToggleAccessibilityServiceCheckBox.getKey());
+        }
+    }
+
+    /**
+     * Restores the instance state from <code>savedInstanceState</code>.
+     */
+    private void restoreInstanceStrate(Bundle savedInstanceState) {
+        String key = savedInstanceState.getString(KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX);
+        if (key != null) {
+            Preference preference = findPreference(key);
+            if (!(preference instanceof CheckBoxPreference)) {
+                throw new IllegalArgumentException(
+                        KEY_TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX
+                                + " must be mapped to an instance of a "
+                                + CheckBoxPreference.class.getName());
+            }
+            mToggleAccessibilityServiceCheckBox = (CheckBoxPreference) preference;
         }
     }
 
@@ -208,7 +236,7 @@
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         final String key = preference.getKey();
 
-        if (TOGGLE_ACCESSIBILITY_SERVICE_CHECKBOX.equals(key)) {
+        if (TOGGLE_ACCESSIBILITY_CHECKBOX.equals(key)) {
             handleEnableAccessibilityStateChange((CheckBoxPreference) preference);
         } else if (POWER_BUTTON_ENDS_CALL_CHECKBOX.equals(key)) {
             boolean isChecked = ((CheckBoxPreference) preference).isChecked();
@@ -327,22 +355,6 @@
         }
     }
 
-    /**
-     * Displays a message telling the user that they do not have any accessibility
-     * related apps installed and that they can get TalkBack (Google's free screen
-     * reader) from Market.
-     */
-    private void displayNoAppsAlert() {
-        try {
-            PackageManager pm = getActivity().getPackageManager();
-            ApplicationInfo info = pm.getApplicationInfo("com.android.vending", 0);
-            showDialog(DIALOG_ID_NO_ACCESSIBILITY_SERVICES);
-        } catch (NameNotFoundException e) {
-            // This is a no-op if the user does not have Android Market
-            return;
-        }
-    }
-
     @Override
     public Dialog onCreateDialog(int dialogId) {
         switch (dialogId) {
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index 09584ad..00706ad 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -209,7 +209,6 @@
     public static class PrivacySettingsActivity extends Settings { }
     public static class DockSettingsActivity extends Settings { }
     public static class RunningServicesActivity extends Settings { }
-    public static class VoiceInputOutputSettingsActivity extends Settings { }
     public static class ManageAccountsSettingsActivity extends Settings { }
     public static class PowerUsageSummaryActivity extends Settings { }
     public static class AccountSyncSettingsActivity extends Settings { }
diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index a2f701d..6f0c91f 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -23,7 +23,6 @@
 import android.content.ContentResolver;
 import android.content.Intent;
 import android.content.pm.PackageManager;
-import android.content.res.Resources;
 import android.os.Bundle;
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceFragment;
@@ -49,9 +48,6 @@
 
     private SettingsDialogFragment mDialogFragment;
 
-    private int mResultCode = Activity.RESULT_CANCELED;
-    private Intent mResultData;
-
     private Button mNextButton;
 
     @Override
@@ -114,18 +110,55 @@
     }
 
     public static class SettingsDialogFragment extends DialogFragment {
+        private static final String KEY_DIALOG_ID = "key_dialog_id";
+        private static final String KEY_PARENT_FRAGMENT_ID = "key_parent_fragment_id";
+
         private int mDialogId;
 
-        private DialogCreatable mFragment;
+        private Fragment mParentFragment;
+
+        public SettingsDialogFragment() {
+            /* do nothing */
+        }
 
         public SettingsDialogFragment(DialogCreatable fragment, int dialogId) {
             mDialogId = dialogId;
-            mFragment = fragment;
+            if (!(fragment instanceof Fragment)) {
+                throw new IllegalArgumentException("fragment argument must be an instance of "
+                        + Fragment.class.getName());
+            }
+            mParentFragment = (Fragment) fragment;
+        }
+
+        @Override
+        public void onActivityCreated(Bundle savedInstanceState) {
+            if (savedInstanceState != null) {
+                mDialogId = savedInstanceState.getInt(KEY_DIALOG_ID, 0);
+                int mParentFragmentId = savedInstanceState.getInt(KEY_PARENT_FRAGMENT_ID, -1);
+                if (mParentFragmentId > -1) {
+                    mParentFragment = getFragmentManager().findFragmentById(mParentFragmentId);
+                    if (!(mParentFragment instanceof DialogCreatable)) {
+                        throw new IllegalArgumentException(
+                                KEY_PARENT_FRAGMENT_ID + " must implement "
+                                        + DialogCreatable.class.getName());
+                    }
+                }
+            }
+            super.onActivityCreated(savedInstanceState);
+        }
+
+        @Override
+        public void onSaveInstanceState(Bundle outState) {
+            super.onSaveInstanceState(outState);
+            if (mParentFragment != null) {
+                outState.putInt(KEY_DIALOG_ID, mDialogId);
+                outState.putInt(KEY_PARENT_FRAGMENT_ID, mParentFragment.getId());
+            }
         }
 
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
-            return mFragment.onCreateDialog(mDialogId);
+            return ((DialogCreatable) mParentFragment).onCreateDialog(mDialogId);
         }
 
         public int getDialogId() {
diff --git a/src/com/android/settings/VoiceInputOutputSettings.java b/src/com/android/settings/VoiceInputOutputSettings.java
index b07c69e..1e86801 100644
--- a/src/com/android/settings/VoiceInputOutputSettings.java
+++ b/src/com/android/settings/VoiceInputOutputSettings.java
@@ -16,9 +16,6 @@
 
 package com.android.settings;
 
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-
 import android.content.ComponentName;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -28,7 +25,6 @@
 import android.content.res.Resources;
 import android.content.res.TypedArray;
 import android.content.res.XmlResourceParser;
-import android.os.Bundle;
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceCategory;
@@ -45,15 +41,16 @@
 import java.util.HashMap;
 import java.util.List;
 
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
 /**
  * Settings screen for voice input/output.
  */
-public class VoiceInputOutputSettings extends SettingsPreferenceFragment
-        implements OnPreferenceChangeListener {
-    
+public class VoiceInputOutputSettings implements OnPreferenceChangeListener {
+
     private static final String TAG = "VoiceInputOutputSettings";
-    
-    private static final String KEY_PARENT = "parent";
+
     private static final String KEY_VOICE_INPUT_CATEGORY = "voice_input_category";
     private static final String KEY_RECOGNIZER = "recognizer";
     private static final String KEY_RECOGNIZER_SETTINGS = "recognizer_settings";
@@ -62,41 +59,42 @@
     private PreferenceCategory mVoiceInputCategory;
     private ListPreference mRecognizerPref;
     private PreferenceScreen mSettingsPref;
-    
+    private SettingsPreferenceFragment mFragment;
+
     private HashMap<String, ResolveInfo> mAvailableRecognizersMap;
-    
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
 
-        addPreferencesFromResource(R.xml.voice_input_output_settings);
+    public VoiceInputOutputSettings(SettingsPreferenceFragment fragment) {
+        mFragment = fragment;
+    }
 
-        mParent = (PreferenceGroup) findPreference(KEY_PARENT);
+    public void onCreate() {
+
+        mParent = (PreferenceGroup) mFragment.getPreferenceScreen();
         mVoiceInputCategory = (PreferenceCategory) mParent.findPreference(KEY_VOICE_INPUT_CATEGORY);
-        mRecognizerPref = (ListPreference) mParent.findPreference(KEY_RECOGNIZER);
+        mRecognizerPref = (ListPreference) mVoiceInputCategory.findPreference(KEY_RECOGNIZER);
         mRecognizerPref.setOnPreferenceChangeListener(this);
-        mSettingsPref = (PreferenceScreen) mParent.findPreference(KEY_RECOGNIZER_SETTINGS);
-        
+        mSettingsPref = (PreferenceScreen)
+                mVoiceInputCategory.findPreference(KEY_RECOGNIZER_SETTINGS);
+
         mAvailableRecognizersMap = new HashMap<String, ResolveInfo>();
-        
+
         populateOrRemoveRecognizerPreference();
     }
-    
+
     private void populateOrRemoveRecognizerPreference() {
-        List<ResolveInfo> availableRecognitionServices = getPackageManager().queryIntentServices(
+        List<ResolveInfo> availableRecognitionServices =
+                mFragment.getPackageManager().queryIntentServices(
                 new Intent(RecognitionService.SERVICE_INTERFACE), PackageManager.GET_META_DATA);
         int numAvailable = availableRecognitionServices.size();
         
         if (numAvailable == 0) {
             // No recognizer available - remove all related preferences.
-            removePreference(mVoiceInputCategory);
-            removePreference(mRecognizerPref);
-            removePreference(mSettingsPref);
+            mFragment.getPreferenceScreen().removePreference(mVoiceInputCategory);
         } else if (numAvailable == 1) {
             // Only one recognizer available, so don't show the list of choices, but do
             // set up the link to settings for the available recognizer.
-            removePreference(mRecognizerPref);
-            
+            mVoiceInputCategory.removePreference(mRecognizerPref);
+
             // But first set up the available recognizers map with just the one recognizer.
             ResolveInfo resolveInfo = availableRecognitionServices.get(0);
             String recognizerComponent =
@@ -106,20 +104,14 @@
             mAvailableRecognizersMap.put(recognizerComponent, resolveInfo);
             
             String currentSetting = Settings.Secure.getString(
-                    getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
+                    mFragment.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
             updateSettingsLink(currentSetting);
         } else {
             // Multiple recognizers available, so show the full list of choices.
             populateRecognizerPreference(availableRecognitionServices);
         }
     }
-    
-    private void removePreference(Preference pref) {
-        if (pref != null) {
-            mParent.removePreference(pref);
-        }
-    }
-    
+
     private void populateRecognizerPreference(List<ResolveInfo> recognizers) {
         int size = recognizers.size();
         CharSequence[] entries = new CharSequence[size];
@@ -127,7 +119,7 @@
         
         // Get the current value from the secure setting.
         String currentSetting = Settings.Secure.getString(
-                getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
+                mFragment.getContentResolver(), Settings.Secure.VOICE_RECOGNITION_SERVICE);
         
         // Iterate through all the available recognizers and load up their info to show
         // in the preference. Also build up a map of recognizer component names to their
@@ -140,7 +132,7 @@
             
             mAvailableRecognizersMap.put(recognizerComponent, resolveInfo);
 
-            entries[i] = resolveInfo.loadLabel(getPackageManager());
+            entries[i] = resolveInfo.loadLabel(mFragment.getPackageManager());
             values[i] = recognizerComponent;
         }
         
@@ -159,13 +151,14 @@
         XmlResourceParser parser = null;
         String settingsActivity = null;
         try {
-            parser = si.loadXmlMetaData(getPackageManager(), RecognitionService.SERVICE_META_DATA);
+            parser = si.loadXmlMetaData(mFragment.getPackageManager(),
+                    RecognitionService.SERVICE_META_DATA);
             if (parser == null) {
                 throw new XmlPullParserException("No " + RecognitionService.SERVICE_META_DATA +
                         " meta-data for " + si.packageName);
             }
             
-            Resources res = getPackageManager().getResourcesForApplication(
+            Resources res = mFragment.getPackageManager().getResourcesForApplication(
                     si.applicationInfo);
             
             AttributeSet attrs = Xml.asAttributeSet(parser);
@@ -200,25 +193,24 @@
             // No settings preference available - hide the preference.
             Log.w(TAG, "no recognizer settings available for " + si.packageName);
             mSettingsPref.setIntent(null);
-            mParent.removePreference(mSettingsPref);
+            mVoiceInputCategory.removePreference(mSettingsPref);
         } else {
             Intent i = new Intent(Intent.ACTION_MAIN);
             i.setComponent(new ComponentName(si.packageName, settingsActivity));
             mSettingsPref.setIntent(i);
-            mRecognizerPref.setSummary(currentRecognizer.loadLabel(getPackageManager()));
+            mRecognizerPref.setSummary(currentRecognizer.loadLabel(mFragment.getPackageManager()));
         }
     }
     
     public boolean onPreferenceChange(Preference preference, Object newValue) {
         if (preference == mRecognizerPref) {
             String setting = (String) newValue;
-            
+
             // Put the new value back into secure settings.
-            Settings.Secure.putString(
-                    getContentResolver(),
+            Settings.Secure.putString(mFragment.getContentResolver(),
                     Settings.Secure.VOICE_RECOGNITION_SERVICE,
                     setting);
-            
+
             // Update the settings item so it points to the right settings.
             updateSettingsLink(setting);
         }
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 22fa8f6..5322555 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -127,7 +127,7 @@
         }
 
         // Remove NFC if its not available
-        if (NfcAdapter.getDefaultAdapter() == null) {
+        if (NfcAdapter.getDefaultAdapter(this) == null) {
             getPreferenceScreen().removePreference(nfc);
         }
 
diff --git a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
index 22cec54..ef59201 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndLanguageSettings.java
@@ -19,6 +19,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.VoiceInputOutputSettings;
 
 import android.app.AlertDialog;
 import android.content.Context;
@@ -81,6 +82,8 @@
         }
         mCheckboxes = new ArrayList<CheckBoxPreference>();
         onCreateIMM();
+
+        new VoiceInputOutputSettings(this).onCreate();
     }
 
     private boolean isSystemIme(InputMethodInfo property) {
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
index e3a44b7..d1cec13 100644
--- a/src/com/android/settings/nfc/NfcEnabler.java
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -60,7 +60,7 @@
     public NfcEnabler(Context context, CheckBoxPreference checkBoxPreference) {
         mContext = context;
         mCheckbox = checkBoxPreference;
-        mNfcAdapter = NfcAdapter.getDefaultAdapter();
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
 
         if (mNfcAdapter == null) {
             // NFC is not supported
diff --git a/src/com/android/settings/vpn/VpnSettings.java b/src/com/android/settings/vpn/VpnSettings.java
index 4dfe21a..ea16f9d 100644
--- a/src/com/android/settings/vpn/VpnSettings.java
+++ b/src/com/android/settings/vpn/VpnSettings.java
@@ -216,23 +216,27 @@
         }
     }
 
+    private class ConnectDialog extends AlertDialog {
+        public ConnectDialog(Context context) {
+            super(context);
+            setTitle(String.format(getString(R.string.vpn_connect_to),
+                    mActiveProfile.getName()));
+            setButton(DialogInterface.BUTTON_POSITIVE,
+                    getString(R.string.vpn_connect_button),
+                    VpnSettings.this);
+            setButton(DialogInterface.BUTTON_NEGATIVE,
+                    getString(android.R.string.cancel),
+                    VpnSettings.this);
+            setView(mConnectingActor.createConnectView());
+        }
+        public void onBackPressed() {
+            changeState(mActiveProfile, VpnState.IDLE);
+            super.onBackPressed();
+        }
+    }
+
     private Dialog createConnectDialog() {
-        final Activity activity = getActivity();
-        return new AlertDialog.Builder(activity)
-                .setView(mConnectingActor.createConnectView())
-                .setTitle(String.format(activity.getString(R.string.vpn_connect_to),
-                        mActiveProfile.getName()))
-                .setPositiveButton(activity.getString(R.string.vpn_connect_button),
-                        this)
-                .setNegativeButton(activity.getString(android.R.string.cancel),
-                        this)
-                .setOnCancelListener(new DialogInterface.OnCancelListener() {
-                            public void onCancel(DialogInterface dialog) {
-                                removeDialog(DIALOG_CONNECT);
-                                changeState(mActiveProfile, VpnState.IDLE);
-                            }
-                        })
-                .create();
+        return new ConnectDialog(getActivity());
     }
 
     private Dialog createReconnectDialog(int id) {
