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:
