diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java
index 78cf8cf..4e60dba 100644
--- a/src/com/android/settings/WirelessSettings.java
+++ b/src/com/android/settings/WirelessSettings.java
@@ -20,7 +20,6 @@
 import android.content.Context;
 import android.content.Intent;
 import android.net.ConnectivityManager;
-import android.net.wifi.WifiManager;
 import android.os.Bundle;
 import android.os.ServiceManager;
 import android.os.SystemProperties;
@@ -29,28 +28,30 @@
 import android.preference.PreferenceActivity;
 import android.preference.PreferenceScreen;
 import android.provider.Settings;
-import android.util.Log;
-
 import com.android.internal.telephony.TelephonyIntents;
 import com.android.internal.telephony.TelephonyProperties;
 import com.android.settings.bluetooth.BluetoothEnabler;
 import com.android.settings.wifi.WifiEnabler;
+import com.android.settings.nfc.NfcEnabler;
 
 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_TOGGLE_NFC = "toggle_nfc";
     private static final String KEY_WIFI_SETTINGS = "wifi_settings";
     private static final String KEY_BT_SETTINGS = "bt_settings";
     private static final String KEY_VPN_SETTINGS = "vpn_settings";
     private static final String KEY_TETHER_SETTINGS = "tether_settings";
+
     public static final String EXIT_ECM_RESULT = "exit_ecm_result";
     public static final int REQUEST_CODE_EXIT_ECM = 1;
 
     private AirplaneModeEnabler mAirplaneModeEnabler;
     private CheckBoxPreference mAirplaneModePreference;
     private WifiEnabler mWifiEnabler;
+    private NfcEnabler mNfcEnabler;
     private BluetoothEnabler mBtEnabler;
 
     /**
@@ -91,11 +92,13 @@
         CheckBoxPreference airplane = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
         CheckBoxPreference wifi = (CheckBoxPreference) findPreference(KEY_TOGGLE_WIFI);
         CheckBoxPreference bt = (CheckBoxPreference) findPreference(KEY_TOGGLE_BLUETOOTH);
+        CheckBoxPreference nfc = (CheckBoxPreference) findPreference(KEY_TOGGLE_NFC);
 
         mAirplaneModeEnabler = new AirplaneModeEnabler(this, airplane);
         mAirplaneModePreference = (CheckBoxPreference) findPreference(KEY_TOGGLE_AIRPLANE);
         mWifiEnabler = new WifiEnabler(this, wifi);
         mBtEnabler = new BluetoothEnabler(this, bt);
+        mNfcEnabler = new NfcEnabler(this, nfc);
 
         String toggleable = Settings.System.getString(getContentResolver(),
                 Settings.System.AIRPLANE_MODE_TOGGLEABLE_RADIOS);
@@ -113,9 +116,14 @@
             findPreference(KEY_BT_SETTINGS).setDependency(KEY_TOGGLE_AIRPLANE);
         }
 
-        // Disable Bluetooth Settings if Bluetooth service is not available.
+        // Remove Bluetooth Settings if Bluetooth service is not available.
         if (ServiceManager.getService(BluetoothAdapter.BLUETOOTH_SERVICE) == null) {
-            findPreference(KEY_BT_SETTINGS).setEnabled(false);
+            getPreferenceScreen().removePreference(bt);
+        }
+
+        // Remove NFC if its not available
+        if (ServiceManager.getService(Context.NFC_SERVICE) == null) {
+            getPreferenceScreen().removePreference(nfc);
         }
 
         // Disable Tethering if it's not allowed
@@ -145,21 +153,23 @@
     @Override
     protected void onResume() {
         super.onResume();
-        
+
         mAirplaneModeEnabler.resume();
         mWifiEnabler.resume();
         mBtEnabler.resume();
+        mNfcEnabler.resume();
     }
-    
+
     @Override
     protected void onPause() {
         super.onPause();
-        
+
         mAirplaneModeEnabler.pause();
         mWifiEnabler.pause();
         mBtEnabler.pause();
+        mNfcEnabler.pause();
     }
-    
+
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         if (requestCode == REQUEST_CODE_EXIT_ECM) {
diff --git a/src/com/android/settings/nfc/NfcEnabler.java b/src/com/android/settings/nfc/NfcEnabler.java
new file mode 100644
index 0000000..8bd9654
--- /dev/null
+++ b/src/com/android/settings/nfc/NfcEnabler.java
@@ -0,0 +1,106 @@
+/*
+ * 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.
+ */
+
+package com.android.settings.nfc;
+
+import com.android.settings.R;
+import com.trustedlogic.trustednfc.android.NfcException;
+import com.trustedlogic.trustednfc.android.NfcManager;
+import android.content.Context;
+import android.preference.Preference;
+import android.preference.CheckBoxPreference;
+import android.provider.Settings;
+import android.util.Log;
+
+/**
+ * NfcEnabler is a helper to manage the Nfc on/off checkbox preference. It is
+ * turns on/off Nfc and ensures the summary of the preference reflects the
+ * current state.
+ */
+public class NfcEnabler implements Preference.OnPreferenceChangeListener {
+    private static final String TAG = "NfcEnabler";
+
+    private final Context mContext;
+    private final CheckBoxPreference mCheckbox;
+    private final NfcManager mNfcManager;
+
+    private boolean mNfcState;
+
+    public NfcEnabler(Context context, CheckBoxPreference checkBoxPreference) {
+        mContext = context;
+        mCheckbox = checkBoxPreference;
+        mNfcManager = (NfcManager) context.getSystemService(Context.NFC_SERVICE);
+
+        if (mNfcManager == null) {
+            // NFC is not supported
+            mCheckbox.setEnabled(false);
+        }
+    }
+
+    public void resume() {
+        if (mNfcManager == null) {
+            return;
+        }
+		mCheckbox.setOnPreferenceChangeListener(this);
+		mNfcState = Settings.System.getInt(mContext.getContentResolver(),
+		        Settings.System.NFC_ON, 0) != 0;
+		updateUi();
+    }
+
+    public void pause() {
+        if (mNfcManager == null) {
+            return;
+        }
+        mCheckbox.setOnPreferenceChangeListener(null);
+    }
+
+    public boolean onPreferenceChange(Preference preference, Object value) {
+        // Turn on/off Nfc
+        mNfcState = (Boolean) value;
+        setEnabled();
+
+        return false;
+    }
+
+    private void setEnabled() {
+        if (mNfcState) {
+            try {
+                mNfcManager.enable();
+            } catch (NfcException e) {
+                Log.w(TAG, "NFC enabling failed: " + e.getMessage());
+				mNfcState = false;
+            }
+
+        } else {
+            try {
+                mNfcManager.disable();
+            } catch (NfcException e) {
+                Log.w(TAG, "NFC disabling failed: " + e.getMessage());
+				mNfcState = true;
+            }
+        }
+		updateUi();
+	}
+
+    private void updateUi() {
+        mCheckbox.setChecked(mNfcState);
+        if (mNfcState) {
+            mCheckbox.setSummary(R.string.nfc_quick_toggle_summary);
+        } else {
+            mCheckbox.setSummary("");
+        }
+    }
+}
\ No newline at end of file
