diff --git a/res/xml/wireless_settings.xml b/res/xml/wireless_settings.xml
index 4731fb3..de62687 100644
--- a/res/xml/wireless_settings.xml
+++ b/res/xml/wireless_settings.xml
@@ -22,13 +22,12 @@
                     android:key="toggle_wifi"
                     android:title="@string/wifi_quick_toggle_title"
                     android:summary="@string/wifi_quick_toggle_summary"
-                    android:persistent="false"
-                    android:dependency="toggle_airplane" />
+                    android:persistent="false" />
 
                 <PreferenceScreen
+                    android:key="wifi_settings"
                     android:title="@string/wifi_settings"
-                    android:summary="@string/wifi_settings_summary"
-                    android:dependency="toggle_airplane">
+                    android:summary="@string/wifi_settings_summary" >
                     <intent
                         android:action="android.intent.action.MAIN"
                         android:targetPackage="com.android.settings"
@@ -53,9 +52,9 @@
                 </PreferenceScreen>
 
                 <PreferenceScreen
+                    android:key="vpn_settings"
                     android:title="@string/vpn_settings_title"
-                    android:summary="@string/vpn_settings_summary"
-                    android:dependency="toggle_airplane">
+                    android:summary="@string/vpn_settings_summary" >
                     <intent
                         android:action="android.intent.action.MAIN"
                         android:targetPackage="com.android.settings"
diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java
index f105712..45411b2 100644
--- a/src/com/android/settings/AirplaneModeEnabler.java
+++ b/src/com/android/settings/AirplaneModeEnabler.java
@@ -74,7 +74,7 @@
         mCheckBoxPref.setOnPreferenceChangeListener(null);
     }
     
-    static boolean isAirplaneModeOn(Context context) {
+    public static boolean isAirplaneModeOn(Context context) {
         return Settings.System.getInt(context.getContentResolver(),
                 Settings.System.AIRPLANE_MODE_ON, 0) != 0;
     }
diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index d112915..f160bac 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -21,14 +21,18 @@
 
 import android.net.wifi.WifiManager;
 import android.os.Bundle;
-import android.preference.PreferenceActivity;
 import android.preference.CheckBoxPreference;
+import android.preference.Preference;
+import android.preference.PreferenceActivity;
+import android.provider.Settings;
 
 public class WirelessSettings extends PreferenceActivity {
 
     private static final String KEY_TOGGLE_AIRPLANE = "toggle_airplane";
     private static final String KEY_TOGGLE_BLUETOOTH = "toggle_bluetooth";
     private static final String KEY_TOGGLE_WIFI = "toggle_wifi";
+    private static final String KEY_WIFI_SETTINGS = "wifi_settings";
+    private static final String KEY_VPN_SETTINGS = "vpn_settings";
 
     private WifiEnabler mWifiEnabler;
     private AirplaneModeEnabler mAirplaneModeEnabler;
@@ -63,18 +67,27 @@
     
     private void initToggles() {
         
+        Preference airplanePreference = findPreference(KEY_TOGGLE_AIRPLANE);
+        Preference wifiPreference = findPreference(KEY_TOGGLE_WIFI);
+        Preference btPreference = findPreference(KEY_TOGGLE_BLUETOOTH);
+        Preference wifiSettings = findPreference(KEY_WIFI_SETTINGS);
+        Preference vpnSettings = findPreference(KEY_VPN_SETTINGS);
+
         mWifiEnabler = new WifiEnabler(
-                this,
-                (WifiManager) getSystemService(WIFI_SERVICE),
-                (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI));
-        
+                this, (WifiManager) getSystemService(WIFI_SERVICE),
+                (CheckBoxPreference) wifiPreference);
         mAirplaneModeEnabler = new AirplaneModeEnabler(
-                this,
-                (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE));
-        
-        mBtEnabler = new BluetoothEnabler(
-                this,
-                (CheckBoxPreference) findPreference(KEY_TOGGLE_BLUETOOTH));
+                this, (CheckBoxPreference) airplanePreference);
+        mBtEnabler = new BluetoothEnabler(this, (CheckBoxPreference) btPreference);
+
+        // manually set up dependencies for Wifi if its radio is not toggleable in airplane mode
+        String toggleableRadios = Settings.System.getString(getContentResolver(),
+                Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+        if (toggleableRadios == null || !toggleableRadios.contains(Settings.System.RADIO_WIFI)) {
+            wifiPreference.setDependency(airplanePreference.getKey());
+            wifiSettings.setDependency(airplanePreference.getKey());
+            vpnSettings.setDependency(airplanePreference.getKey());
+        }
     }
-    
+
 }
diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java
index 88cfe06..10a672b 100644
--- a/src/com/android/settings/wifi/WifiEnabler.java
+++ b/src/com/android/settings/wifi/WifiEnabler.java
@@ -23,6 +23,7 @@
 import static android.net.wifi.WifiManager.WIFI_STATE_UNKNOWN;
 
 import com.android.settings.R;
+import com.android.settings.AirplaneModeEnabler;
 
 import android.content.BroadcastReceiver;
 import android.content.Context;
@@ -32,6 +33,7 @@
 import android.net.wifi.WifiManager;
 import android.preference.Preference;
 import android.preference.CheckBoxPreference;
+import android.provider.Settings;
 import android.text.TextUtils;
 import android.util.Config;
 import android.util.Log;
@@ -121,7 +123,7 @@
             mWifiCheckBoxPref
                     .setSummary(wifiState == WIFI_STATE_DISABLED ? mOriginalSummary : null);
             
-            mWifiCheckBoxPref.setEnabled(isEnabledByDependency());
+            mWifiCheckBoxPref.setEnabled(isWifiAllowed(mContext));
             
         } else if (wifiState == WIFI_STATE_DISABLING || wifiState == WIFI_STATE_ENABLING) {
             mWifiCheckBoxPref.setSummary(wifiState == WIFI_STATE_ENABLING ? R.string.wifi_starting
@@ -151,24 +153,23 @@
         }
     }
 
-    private boolean isEnabledByDependency() {
-        Preference dep = getDependencyPreference();
-        if (dep == null) {
+    private static boolean isWifiAllowed(Context context) {
+        // allowed if we are not in airplane mode
+        if (!AirplaneModeEnabler.isAirplaneModeOn(context)) {
             return true;
         }
-        
-        return !dep.shouldDisableDependents();
-    }
-    
-    private Preference getDependencyPreference() {
-        String depKey = mWifiCheckBoxPref.getDependency();
-        if (TextUtils.isEmpty(depKey)) {
-            return null;
+        // allowed if wifi is not in AIRPLANE_MODE_RADIOS
+        String radios = Settings.System.getString(context.getContentResolver(),
+                Settings.System.AIRPLANE_MODE_RADIOS);
+        if (radios == null || !radios.contains(Settings.System.RADIO_WIFI)) {
+            return true;
         }
-        
-        return mWifiCheckBoxPref.getPreferenceManager().findPreference(depKey);
+        // allowed if wifi is in AIRPLANE_MODE_TOGGLEABLE_RADIOS
+        radios = Settings.System.getString(context.getContentResolver(),
+                Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+        return (radios != null && radios.contains(Settings.System.RADIO_WIFI));
     }
-    
+
     private static String getHumanReadableWifiState(int wifiState) {
         switch (wifiState) {
             case WIFI_STATE_DISABLED:
