diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 5cc3aa3..11dc35c 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -52,12 +52,9 @@
 import android.provider.ContactsContract.CommonDataKinds;
 import android.provider.MediaStore;
 import android.provider.Settings;
-import android.provider.Settings.SettingNotFoundException;
 import android.telephony.PhoneNumberUtils;
-import android.text.Spannable;
-import android.text.SpannableString;
+import android.telephony.TelephonyManager;
 import android.text.TextUtils;
-import android.text.style.TypefaceSpan;
 import android.util.Log;
 import android.view.MenuItem;
 import android.view.WindowManager;
@@ -194,6 +191,9 @@
     private static final String SIP_SETTINGS_CATEGORY_KEY =
             "sip_settings_category_key";
 
+    private static final String WHEN_TO_MAKE_WIFI_CALLS_KEY =
+            "when_to_make_wifi_calls_key";
+
     private Intent mContactListIntent;
 
     /** Event for Async voicemail change call */
@@ -273,6 +273,7 @@
     private ListPreference mButtonDTMF;
     private ListPreference mButtonTTY;
     private ListPreference mButtonSipCallOptions;
+    private ListPreference mWifiCallOptionsPreference;
     private ListPreference mVoicemailProviders;
     private PreferenceScreen mVoicemailSettings;
     private Preference mVoicemailNotificationRingtone;
@@ -591,6 +592,8 @@
             }
         } else if (preference == mButtonSipCallOptions) {
             handleSipCallOptionsChange(objValue);
+        } else if (preference == mWifiCallOptionsPreference) {
+            handleWifiCallSettingsChange(objValue);
         }
         // always let the preference setting proceed.
         return true;
@@ -1638,6 +1641,7 @@
         updateVoiceNumberField();
         mVMProviderSettingsForced = false;
         createSipCallSettings();
+        createWifiCallSettings();
 
         mRingtoneLookupRunnable = new Runnable() {
             @Override
@@ -1736,6 +1740,38 @@
         }
     }
 
+    private void createWifiCallSettings() {
+        addPreferencesFromResource(R.xml.wifi_settings_category);
+        mWifiCallOptionsPreference = (ListPreference) findPreference(WHEN_TO_MAKE_WIFI_CALLS_KEY);
+        mWifiCallOptionsPreference.setOnPreferenceChangeListener(this);
+        mWifiCallOptionsPreference.setValueIndex(
+                mWifiCallOptionsPreference.findIndexOfValue(
+                        getWhenToMakeWifiCalls()));
+        mWifiCallOptionsPreference.setSummary(mWifiCallOptionsPreference.getEntry());
+    }
+
+    /**
+     * @see android.telephony.TelephonyManager.WifiCallingChoices
+     */
+    private String getWhenToMakeWifiCalls() {
+        int setting;
+        try {
+            setting = Settings.System.getInt(mPhone.getContext().getContentResolver(),
+                    Settings.System.WHEN_TO_MAKE_WIFI_CALLS);
+        } catch (Settings.SettingNotFoundException e) {
+            setting = TelephonyManager.WifiCallingChoices.NEVER_USE;
+        }
+        return Integer.toString(setting);
+    }
+
+    /**
+     * @see android.telephony.TelephonyManager.WifiCallingChoices
+     */
+    public void setWhenToMakeWifiCalls(String value) {
+        Settings.System.putInt(mPhone.getContext().getContentResolver(),
+               Settings.System.WHEN_TO_MAKE_WIFI_CALLS, Integer.valueOf(value));
+    }
+
     // Gets the call options for SIP depending on whether SIP is allowed only
     // on Wi-Fi only; also make the other options preference invisible.
     private ListPreference getSipCallOptionPreference() {
@@ -1893,6 +1929,14 @@
         mButtonSipCallOptions.setSummary(mButtonSipCallOptions.getEntry());
     }
 
+    private void handleWifiCallSettingsChange(Object objValue) {
+        String option = objValue.toString();
+        setWhenToMakeWifiCalls(option);
+        mWifiCallOptionsPreference.setValueIndex(
+                mWifiCallOptionsPreference.findIndexOfValue(option));
+        mWifiCallOptionsPreference.setSummary(mWifiCallOptionsPreference.getEntry());
+    }
+
     private void updatePreferredTtyModeSummary(int TtyMode) {
         String [] txts = getResources().getStringArray(R.array.tty_mode_entries);
         switch(TtyMode) {
