diff --git a/res/values/strings.xml b/res/values/strings.xml
index 44e26c3..eb47a62 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -10099,4 +10099,10 @@
 
     <!-- Label for the disagree button on wfc disclaimer fragment. [CHAR LIMIT=30] -->
     <string name="wfc_disclaimer_disagree_text">NO THANKS</string>
+
+    <!-- Label for the title on wfc disclaimer location. [CHAR LIMIT=30] -->
+    <string name="wfc_disclaimer_location_title_text">Location</string>
+
+    <!-- Warn the user that the phone may share its location with the service provider. [CHAR LIMIT=NONE] -->
+    <string name="wfc_disclaimer_location_desc_text">Your service provider may collect your location in order to provide this service.\n\nPlease review your service provider\u2019s privacy policy.</string>
 </resources>
diff --git a/src/com/android/settings/wifi/calling/DisclaimerItemFactory.java b/src/com/android/settings/wifi/calling/DisclaimerItemFactory.java
index 6d8dc8f..e3994aa 100644
--- a/src/com/android/settings/wifi/calling/DisclaimerItemFactory.java
+++ b/src/com/android/settings/wifi/calling/DisclaimerItemFactory.java
@@ -51,6 +51,7 @@
 
     private static List<DisclaimerItem> getDisclaimerItemList(Context context, int subId) {
         List<DisclaimerItem> itemList = new ArrayList<DisclaimerItem>();
+        itemList.add(new LocationPolicyDisclaimer(context, subId));
 
         return itemList;
     }
diff --git a/src/com/android/settings/wifi/calling/LocationPolicyDisclaimer.java b/src/com/android/settings/wifi/calling/LocationPolicyDisclaimer.java
new file mode 100644
index 0000000..6354bdd
--- /dev/null
+++ b/src/com/android/settings/wifi/calling/LocationPolicyDisclaimer.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2018 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.wifi.calling;
+
+import android.content.Context;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.settings.R;
+
+/**
+ * Disclaimer item class for displaying location privacy policy UI on
+ * {@link WifiCallingDisclaimerFragment}.
+ */
+class LocationPolicyDisclaimer extends DisclaimerItem {
+    private static final String DISCLAIMER_ITEM_NAME = "LocationPolicyDisclaimer";
+    @VisibleForTesting
+    static final String KEY_HAS_AGREED_LOCATION_DISCLAIMER
+            = "key_has_agreed_location_disclaimer";
+
+    LocationPolicyDisclaimer(Context context, int subId) {
+        super(context, subId);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    boolean shouldShow() {
+        PersistableBundle config = getCarrierConfig();
+        if (!config.getBoolean(CarrierConfigManager.KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL)) {
+            logd("shouldShow: false due to carrier config is false.");
+            return false;
+        }
+
+        if (config.getBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL)) {
+            logd("shouldShow: false due to WFC is on as default.");
+            return false;
+        }
+
+        return super.shouldShow();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getName() {
+        return DISCLAIMER_ITEM_NAME;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected int getTitleId() {
+        return R.string.wfc_disclaimer_location_title_text;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected int getMessageId() {
+        return R.string.wfc_disclaimer_location_desc_text;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    protected String getPrefKey() {
+        return KEY_HAS_AGREED_LOCATION_DISCLAIMER;
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java b/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java
new file mode 100644
index 0000000..9494288
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/wifi/calling/LocationPolicyDisclaimerTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2018 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.wifi.calling;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class LocationPolicyDisclaimerTest {
+    private static final String TEST_SHARED_PREFERENCE = "test_wfc_disclaimer_prefs";
+    private static final int TEST_SUB_ID = 0;
+
+    @Mock
+    private CarrierConfigManager mCarrierConfigManager;
+
+    private final PersistableBundle mBundle = new PersistableBundle();
+    private Context mContext;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+        mContext = spy(RuntimeEnvironment.application);
+
+        doReturn(mCarrierConfigManager).when(mContext).getSystemService(
+                Context.CARRIER_CONFIG_SERVICE);
+        when(mCarrierConfigManager.getConfigForSubId(anyInt())).thenReturn(mBundle);
+        doReturn(getSharedPreferences()).when(mContext).getSharedPreferences(anyString(), anyInt());
+    }
+
+    @Test
+    public void sholdShow_configTrue_shouldShowLocationPolicyDisclaimer() {
+        LocationPolicyDisclaimer disclaimerItem
+                = spy(new LocationPolicyDisclaimer(mContext, TEST_SUB_ID));
+        mBundle.putBoolean(CarrierConfigManager.KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL, true);
+        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL, false);
+        getSharedPreferences().edit().putBoolean(
+                LocationPolicyDisclaimer.KEY_HAS_AGREED_LOCATION_DISCLAIMER + TEST_SUB_ID,
+                false).commit();
+
+        // Check the WFC disclaimer item is should be shown.
+        assertThat(disclaimerItem.shouldShow()).isTrue();
+    }
+
+    @Test
+    public void sholdShow_configFalse_shouldNotShowLocationPolicyDisclaimer() {
+        LocationPolicyDisclaimer disclaimerItem = new LocationPolicyDisclaimer(mContext,
+                TEST_SUB_ID);
+        mBundle.putBoolean(CarrierConfigManager.KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL, false);
+
+        // Check the WFC disclaimer item is should not be shown due to the
+        // KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL on carrier config is false.
+        assertThat(disclaimerItem.shouldShow()).isFalse();
+    }
+
+    @Test
+    public void sholdShow_defaultWfcEnabled_shouldNotShowLocationPolicyDisclaimer() {
+        LocationPolicyDisclaimer disclaimerItem
+                = new LocationPolicyDisclaimer(mContext, TEST_SUB_ID);
+        mBundle.putBoolean(CarrierConfigManager.KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL, true);
+        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL, true);
+
+        // Check the WFC disclaimer item is should not be shown due to the
+        // KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL on carrier config is true.
+        assertThat(disclaimerItem.shouldShow()).isFalse();
+    }
+
+    @Test
+    public void sholdShow_alreadyAgreed_shouldNotShowLocationPolicyDisclaimer() {
+        LocationPolicyDisclaimer disclaimerItem =
+                spy(new LocationPolicyDisclaimer(mContext, TEST_SUB_ID));
+        mBundle.putBoolean(CarrierConfigManager.KEY_SHOW_WFC_LOCATION_PRIVACY_POLICY_BOOL, true);
+        mBundle.putBoolean(CarrierConfigManager.KEY_CARRIER_DEFAULT_WFC_IMS_ENABLED_BOOL, false);
+        getSharedPreferences().edit().putBoolean(
+                LocationPolicyDisclaimer.KEY_HAS_AGREED_LOCATION_DISCLAIMER + TEST_SUB_ID, true)
+                .commit();
+
+        // Check the WFC disclaimer item is should not be shown due to an item is already agreed.
+        assertThat(disclaimerItem.shouldShow()).isFalse();
+    }
+
+    @Test
+    public void onAgreed_shouldSetSharedPreferencesToAgreed() {
+        LocationPolicyDisclaimer disclaimerItem
+                =spy(new LocationPolicyDisclaimer(mContext, TEST_SUB_ID));
+
+        disclaimerItem.onAgreed();
+
+        // Check the SharedPreferences key is changed to agreed.
+        assertThat(getSharedPreferences().getBoolean(
+                LocationPolicyDisclaimer.KEY_HAS_AGREED_LOCATION_DISCLAIMER + TEST_SUB_ID,
+                false)).isTrue();
+    }
+
+    private SharedPreferences getSharedPreferences() {
+        return mContext.getSharedPreferences(TEST_SHARED_PREFERENCE, Context.MODE_PRIVATE);
+    }
+}
