diff --git a/src/com/android/settings/DeviceInfoSettings.java b/src/com/android/settings/DeviceInfoSettings.java
index 7768b7d..82b7f28 100644
--- a/src/com/android/settings/DeviceInfoSettings.java
+++ b/src/com/android/settings/DeviceInfoSettings.java
@@ -48,6 +48,7 @@
     private static final String KEY_LICENSE = "license";
     private static final String KEY_COPYRIGHT = "copyright";
     private static final String KEY_SYSTEM_UPDATE_SETTINGS = "system_update_settings";
+    private static final String PROPERTY_URL_SAFETYLEGAL = "ro.url.safetylegal";
     
     @Override
     protected void onCreate(Bundle icicle) {
@@ -61,6 +62,10 @@
         setStringSummary("build_number", Build.DISPLAY);
         findPreference("kernel_version").setSummary(getFormattedKernelVersion());
 
+        // Remove Safety information preference if PROPERTY_URL_SAFETYLEGAL is not set
+        removePreferenceIfPropertyMissing(getPreferenceScreen(), "safetylegal",
+                PROPERTY_URL_SAFETYLEGAL);
+
         /*
          * Settings is a generic app and should not contain any device-specific
          * info.
@@ -85,7 +90,21 @@
         Utils.updatePreferenceToSpecificActivityOrRemove(this, parentPreference, KEY_CONTRIBUTORS,
                 Utils.UPDATE_PREFERENCE_FLAG_SET_TITLE_TO_MATCHING_ACTIVITY);
     }
-    
+
+    private void removePreferenceIfPropertyMissing(PreferenceGroup preferenceGroup,
+            String preference, String property ) {
+        if (SystemProperties.get(property).equals(""))
+        {
+            // Property is missing so remove preference from group
+            try {
+                preferenceGroup.removePreference(findPreference(preference));
+            } catch (RuntimeException e) {
+                Log.d(TAG, "Property '" + property + "' missing and no '"
+                        + preference + "' preference");
+            }
+        }
+    }
+
     private void setStringSummary(String preference, String value) {
         try {
             findPreference(preference).setSummary(value);
diff --git a/src/com/android/settings/SettingsSafetyLegalActivity.java b/src/com/android/settings/SettingsSafetyLegalActivity.java
new file mode 100644
index 0000000..83daa05
--- /dev/null
+++ b/src/com/android/settings/SettingsSafetyLegalActivity.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2009 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;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.res.Configuration;
+import android.os.Build;
+import android.os.Bundle;
+import android.os.SystemProperties;
+import android.telephony.TelephonyManager;
+import android.text.TextUtils;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+import com.android.internal.app.AlertActivity;
+import com.android.internal.app.AlertController;
+import android.content.DialogInterface;
+import android.content.DialogInterface.OnClickListener;
+
+/**
+ * The "dialog" that shows from "Safety information" in the Settings app.
+ */
+public class SettingsSafetyLegalActivity extends AlertActivity {
+    private static final String PROPERTY_LSAFETYLEGAL_URL = "ro.url.safetylegal";
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+        String userSafetylegalUrl = SystemProperties.get(PROPERTY_LSAFETYLEGAL_URL);
+
+        final Configuration configuration = getResources().getConfiguration();
+        final String language = configuration.locale.getLanguage();
+        final String country = configuration.locale.getCountry();
+
+        String loc = String.format("locale=%s-%s", language, country);
+
+        userSafetylegalUrl = String.format("%s&%s", userSafetylegalUrl, loc);
+
+        if (!isDataNetworkConnected()) {
+            showErrorAndFinish(userSafetylegalUrl);
+            return;
+        }
+
+        WebView webView = new WebView(this);
+
+        // Begin accessing
+        webView.getSettings().setJavaScriptEnabled(true);
+        webView.loadUrl(userSafetylegalUrl);
+        webView.setWebViewClient(new WebViewClient() {
+            @Override
+            public void onPageFinished(WebView view, String url) {
+                // Change from 'Loading...' to the real title
+                mAlert.setTitle(getString(R.string.settings_safetylegal_activity_title));
+            }
+        });
+
+        final AlertController.AlertParams p = mAlertParams;
+        p.mTitle = getString(R.string.settings_safetylegal_activity_loading);
+        p.mView = webView;
+        p.mForceInverseBackground = true;
+        setupAlert();
+    }
+
+    private void showErrorAndFinish(String url) {
+        new AlertDialog.Builder(this)
+                .setMessage(getResources()
+                        .getString(R.string.settings_safetylegal_activity_unreachable, url))
+                .setTitle(R.string.settings_safetylegal_activity_title)
+                .setPositiveButton(android.R.string.ok, mOkListener)
+                .setCancelable(true)
+                .show();
+    }
+
+    private boolean isDataNetworkConnected() {
+        TelephonyManager mTelephonyManager = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
+
+        if (mTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    private final OnClickListener mOkListener = new OnClickListener() {
+         public void onClick(DialogInterface dialog, int whichButton) {
+             finish();
+         }
+    };
+}
