diff --git a/res/values/strings.xml b/res/values/strings.xml
index b4df5e2..b93dba9 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1102,6 +1102,14 @@
     <string name="location_street_level">When locating, accurate to street level (deselect to conserve battery)</string>
     <!-- Security & location settings screen, setting summary when Enable GPS satellites check box is clear -->
     <string name="location_gps_disabled">Locate to street-level (requires more battery plus view of sky)</string>
+    <!-- Title of warning dialog to user that location information will be logged -->
+    <string name="location_warning_title">Location consent</string>
+    <!-- Warning text to user that location information will be logged -->
+    <string name="location_warning_message">"Allow Google's location service to collect anonymous and aggregate location data.  Collection will occur regardless of whether any applications are active."</string>
+    <!-- Agree button-->
+    <string name="agree">Agree</string>
+    <!-- Disagree button-->
+    <string name="disagree">Disagree</string>
 
     <!-- About -->
     <!-- Main settings screen, setting title for the user to go into the About phone screen -->
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index b34388e..08e4a58 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -18,7 +18,9 @@
 
 
 import android.app.Activity;
+import android.app.AlertDialog;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.SharedPreferences;
 import android.location.LocationManager;
@@ -38,7 +40,7 @@
  * Gesture lock pattern settings.
  */
 public class SecuritySettings extends PreferenceActivity
-    implements SharedPreferences.OnSharedPreferenceChangeListener {
+    implements DialogInterface.OnClickListener, DialogInterface.OnDismissListener {
 
     // Lock Settings
     
@@ -63,6 +65,9 @@
     private CheckBoxPreference mNetwork;
     private CheckBoxPreference mGps;
     private LocationManager mLocationManager;
+    
+    // To track whether Agree was clicked in the Network location warning dialog
+    private boolean mOkClicked;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -79,7 +84,6 @@
 
         mNetwork = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_NETWORK);
         mGps = (CheckBoxPreference) getPreferenceScreen().findPreference(LOCATION_GPS);
-        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
         updateToggles();
     }
 
@@ -184,11 +188,46 @@
         } else if (preference == mShowPassword) {
             Settings.System.putInt(getContentResolver(), Settings.System.TEXT_SHOW_PASSWORD,
                     mShowPassword.isChecked() ? 1 : 0);
+        } else if (preference == mNetwork) {
+            //normally called on the toggle click
+            if (mNetwork.isChecked()) {
+                // Show a warning to the user that location data will be shared 
+                mOkClicked = false;
+                new AlertDialog.Builder(this).setMessage(
+                        getResources().getString(R.string.location_warning_message))
+                        .setTitle(R.string.location_warning_title)
+                        .setIcon(android.R.drawable.ic_dialog_alert)
+                        .setPositiveButton(R.string.agree, this)
+                        .setNegativeButton(R.string.disagree, this)
+                        .show()
+                        .setOnDismissListener(this);
+            } else {
+                updateProviders();
+            }
+        } else if (preference == mGps) {
+            updateProviders();
         }
-        
+
         return false;
     }
 
+    public void onClick(DialogInterface dialog, int which) {
+        if (which == DialogInterface.BUTTON_POSITIVE) {
+            updateProviders();
+            mOkClicked = true;
+        } else {
+            // Reset the toggle
+            mNetwork.setChecked(false);
+        }
+    }
+    
+    public void onDismiss(DialogInterface dialog) {
+        // Assuming that onClick gets called first
+        if (!mOkClicked) {
+            mNetwork.setChecked(false);
+        }
+    }
+
     /*
      * Creates toggles for each available location provider
      */
@@ -233,12 +272,6 @@
         return allowedProviders;
     }
 
-    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {
-        if (LOCATION_NETWORK.equals(key) || LOCATION_GPS.equals(key)) {
-            updateProviders();
-        }
-    }
-
     private boolean isToggled(Preference pref) {
         return ((CheckBoxPreference) pref).isChecked();
     }
