diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 5f7c759..cac964d 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -24,14 +24,11 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.net.ConnectivityManager;
-import android.nfc.NfcAdapter;
-import android.nfc.NfcManager;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
 import android.provider.SearchIndexableResource;
 import android.provider.Settings;
-import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
 import android.telephony.TelephonyManager;
@@ -46,7 +43,7 @@
 import com.android.settings.network.TetherPreferenceController;
 import com.android.settings.network.VpnPreferenceController;
 import com.android.settings.network.WifiCallingPreferenceController;
-import com.android.settings.nfc.NfcEnabler;
+import com.android.settings.nfc.NfcPreferenceController;
 import com.android.settings.search.BaseSearchIndexProvider;
 import com.android.settings.search.Indexable;
 import com.android.settingslib.RestrictedLockUtils;
@@ -64,12 +61,8 @@
         MobilePlanPreferenceController.MobilePlanPreferenceHost {
     private static final String TAG = "WirelessSettings";
 
-    private static final String KEY_TOGGLE_NFC = "toggle_nfc";
     private static final String KEY_WIMAX_SETTINGS = "wimax_settings";
-    private static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings";
 
-    private NfcEnabler mNfcEnabler;
-    private NfcAdapter mNfcAdapter;
     private UserManager mUm;
 
     private AirplaneModePreferenceController mAirplaneModePreferenceController;
@@ -80,6 +73,7 @@
     private WifiCallingPreferenceController mWifiCallingPreferenceController;
     private ProxyPreferenceController mProxyPreferenceController;
     private MobilePlanPreferenceController mMobilePlanPreferenceController;
+    private NfcPreferenceController mNfcPreferenceController;
 
     /**
      * Invoked on each preference click in this hierarchy, overrides
@@ -159,6 +153,7 @@
         mNetworkResetPreferenceController = new NetworkResetPreferenceController(activity);
         mProxyPreferenceController = new ProxyPreferenceController(activity);
         mMobilePlanPreferenceController = new MobilePlanPreferenceController(activity, this);
+        mNfcPreferenceController = new NfcPreferenceController(activity);
 
         mMobilePlanPreferenceController.onCreate(savedInstanceState);
 
@@ -170,12 +165,7 @@
         mNetworkResetPreferenceController.displayPreference(screen);
         mProxyPreferenceController.displayPreference(screen);
         mMobilePlanPreferenceController.displayPreference(screen);
-
-        SwitchPreference nfc = (SwitchPreference) findPreference(KEY_TOGGLE_NFC);
-        RestrictedPreference androidBeam = (RestrictedPreference) findPreference(
-                KEY_ANDROID_BEAM_SETTINGS);
-
-        mNfcEnabler = new NfcEnabler(activity, nfc, androidBeam);
+        mNfcPreferenceController.displayPreference(screen);
 
         String toggleable = Settings.Global.getString(activity.getContentResolver(),
                 Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
@@ -195,22 +185,6 @@
                 ps.setDependency(AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE);
             }
         }
-
-        // Manually set dependencies for NFC when not toggleable.
-        if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_NFC)) {
-            findPreference(KEY_TOGGLE_NFC).setDependency(
-                    AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE);
-            findPreference(KEY_ANDROID_BEAM_SETTINGS).setDependency(
-                    AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE);
-        }
-
-        // Remove NFC if not available
-        mNfcAdapter = NfcAdapter.getDefaultAdapter(activity);
-        if (mNfcAdapter == null) {
-            getPreferenceScreen().removePreference(nfc);
-            getPreferenceScreen().removePreference(androidBeam);
-            mNfcEnabler = null;
-        }
     }
 
     @Override
@@ -218,9 +192,7 @@
         super.onResume();
 
         mAirplaneModePreferenceController.onResume();
-        if (mNfcEnabler != null) {
-            mNfcEnabler.resume();
-        }
+        mNfcPreferenceController.onResume();
     }
 
     @Override
@@ -233,9 +205,7 @@
     public void onPause() {
         super.onPause();
         mAirplaneModePreferenceController.onPause();
-        if (mNfcEnabler != null) {
-            mNfcEnabler.pause();
-        }
+        mNfcPreferenceController.onPause();
     }
 
     @Override
@@ -287,16 +257,7 @@
 
                     new VpnPreferenceController(context).updateNonIndexableKeys(result);
 
-                    // Remove NFC if not available
-                    final NfcManager manager = (NfcManager)
-                            context.getSystemService(Context.NFC_SERVICE);
-                    if (manager != null) {
-                        NfcAdapter adapter = manager.getDefaultAdapter();
-                        if (adapter == null) {
-                            result.add(KEY_TOGGLE_NFC);
-                            result.add(KEY_ANDROID_BEAM_SETTINGS);
-                        }
-                    }
+                    new NfcPreferenceController(context).updateNonIndexableKeys(result);
                     new MobilePlanPreferenceController(context, null /* MobilePlanClickHandler */)
                             .updateNonIndexableKeys(result);
                     new MobileNetworkPreferenceController(context).updateNonIndexableKeys(result);
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index 771f9ba..b913669 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -20,8 +20,10 @@
 import com.android.settings.R;
 import com.android.settings.core.PreferenceController;
 import com.android.settings.dashboard.DashboardFragment;
+import com.android.settings.nfc.NfcPreferenceController;
 import com.android.settingslib.drawer.CategoryKey;
 
+import java.util.ArrayList;
 import java.util.List;
 
 public class ConnectedDeviceDashboardFragment extends DashboardFragment {
@@ -50,7 +52,12 @@
 
     @Override
     protected List<PreferenceController> getPreferenceControllers(Context context) {
-        return null;
+        final NfcPreferenceController nfcPreferenceController =
+                new NfcPreferenceController(context);
+        getLifecycle().addObserver(nfcPreferenceController);
+        final List<PreferenceController> controllers = new ArrayList<>();
+        controllers.add(nfcPreferenceController);
+        return controllers;
     }
 
 }
\ No newline at end of file
diff --git a/src/com/android/settings/nfc/NfcPreferenceController.java b/src/com/android/settings/nfc/NfcPreferenceController.java
new file mode 100644
index 0000000..0d31fe6
--- /dev/null
+++ b/src/com/android/settings/nfc/NfcPreferenceController.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+package com.android.settings.nfc;
+
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.nfc.NfcAdapter;
+import android.nfc.NfcManager;
+import android.os.Handler;
+import android.provider.Settings;
+import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceScreen;
+
+import com.android.settings.core.PreferenceController;
+import com.android.settings.core.lifecycle.LifecycleObserver;
+import com.android.settings.core.lifecycle.events.OnPause;
+import com.android.settings.core.lifecycle.events.OnResume;
+import com.android.settings.network.AirplaneModePreferenceController;
+import com.android.settings.overlay.FeatureFactory;
+import com.android.settingslib.RestrictedPreference;
+
+import java.util.List;
+
+public class NfcPreferenceController extends PreferenceController
+        implements LifecycleObserver, OnResume, OnPause {
+
+    private static final String KEY_TOGGLE_NFC = "toggle_nfc";
+    private static final String KEY_ANDROID_BEAM_SETTINGS = "android_beam_settings";
+
+    private NfcEnabler mNfcEnabler;
+    private NfcAdapter mNfcAdapter;
+    private final Handler mHandler = new Handler();
+    private int mAirplaneMode;
+    private AirplaneModeObserver mAirplaneModeObserver;
+    private SwitchPreference mNfcPreference;
+    private RestrictedPreference mBeamPreference;
+
+    public NfcPreferenceController(Context context) {
+        super(context);
+        mNfcAdapter = NfcAdapter.getDefaultAdapter(context);
+    }
+
+    @Override
+    public void displayPreference(PreferenceScreen screen) {
+        if (!isAvailable()) {
+            removePreference(screen, KEY_TOGGLE_NFC);
+            removePreference(screen, KEY_ANDROID_BEAM_SETTINGS);
+            mNfcEnabler = null;
+            return;
+        }
+        mNfcPreference = (SwitchPreference) screen.findPreference(KEY_TOGGLE_NFC);
+        mBeamPreference = (RestrictedPreference) screen.findPreference(
+                KEY_ANDROID_BEAM_SETTINGS);
+        mNfcEnabler = new NfcEnabler(mContext, mNfcPreference, mBeamPreference);
+        String toggleable = Settings.Global.getString(mContext.getContentResolver(),
+                Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
+        final boolean useNewIA = FeatureFactory.getFactory(mContext)
+                .getDashboardFeatureProvider(mContext).isEnabled();
+        // Manually set dependencies for NFC when not toggleable.
+        if (toggleable == null || !toggleable.contains(Settings.Global.RADIO_NFC)) {
+            if (useNewIA) {
+                mAirplaneModeObserver = new AirplaneModeObserver();
+                updateNfcPreference();
+            } else {
+                mNfcPreference.setDependency(AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE);
+                mBeamPreference.setDependency(AirplaneModePreferenceController.KEY_TOGGLE_AIRPLANE);
+            }
+        }
+    }
+
+    @Override
+    public void updateNonIndexableKeys(List<String> keys) {
+        final NfcManager manager = (NfcManager) mContext.getSystemService(Context.NFC_SERVICE);
+        if (manager != null) {
+            NfcAdapter adapter = manager.getDefaultAdapter();
+            if (adapter == null) {
+                keys.add(KEY_TOGGLE_NFC);
+                keys.add(KEY_ANDROID_BEAM_SETTINGS);
+            }
+        }
+    }
+
+    @Override
+    public boolean handlePreferenceTreeClick(Preference preference) {
+        return false;
+    }
+
+    @Override
+    protected boolean isAvailable() {
+        return mNfcAdapter != null;
+    }
+
+    @Override
+    protected String getPreferenceKey() {
+        return null;
+    }
+
+    public void onResume() {
+        if (mAirplaneModeObserver != null) {
+            mAirplaneModeObserver.register();
+        }
+        if (mNfcEnabler != null) {
+            mNfcEnabler.resume();
+        }
+    }
+
+    @Override
+    public void onPause() {
+        if (mAirplaneModeObserver != null) {
+            mAirplaneModeObserver.unregister();
+        }
+        if (mNfcEnabler != null) {
+            mNfcEnabler.pause();
+        }
+    }
+
+    private void updateNfcPreference() {
+        final int airplaneMode = Settings.Global.getInt(
+                mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, mAirplaneMode);
+        if (airplaneMode == mAirplaneMode) {
+            return;
+        }
+        mAirplaneMode = airplaneMode;
+        boolean toggleable = mAirplaneMode != 1;
+        if (toggleable) {
+            mNfcAdapter.enable();
+        } else {
+            mNfcAdapter.disable();
+        }
+        mNfcPreference.setEnabled(toggleable);
+        mBeamPreference.setEnabled(toggleable);
+    }
+
+    private final class AirplaneModeObserver extends ContentObserver {
+        private final Uri AIRPLANE_MODE_URI =
+                Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON);
+
+        private AirplaneModeObserver() {
+            super(mHandler);
+        }
+
+        public void register() {
+            mContext.getContentResolver().registerContentObserver(AIRPLANE_MODE_URI, false, this);
+        }
+
+        public void unregister() {
+            mContext.getContentResolver().unregisterContentObserver(this);
+        }
+
+        @Override
+        public void onChange(boolean selfChange, Uri uri) {
+            super.onChange(selfChange, uri);
+            updateNfcPreference();
+        }
+    }
+
+}
