diff --git a/src/com/android/settings/SettingsLicenseActivity.java b/src/com/android/settings/SettingsLicenseActivity.java
index 3d66b77..52b48bb 100644
--- a/src/com/android/settings/SettingsLicenseActivity.java
+++ b/src/com/android/settings/SettingsLicenseActivity.java
@@ -16,205 +16,64 @@
 
 package com.android.settings;
 
+import android.app.Activity;
+import android.content.ActivityNotFoundException;
+import android.content.Intent;
+import android.net.Uri;
 import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
 import android.os.SystemProperties;
 import android.text.TextUtils;
 import android.util.Log;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
 import android.widget.Toast;
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.ProgressDialog;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
-import android.content.res.Configuration;
 
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.zip.GZIPInputStream;
+import java.io.File;
 
 /**
  * The "dialog" that shows from "License" in the Settings app.
  */
 public class SettingsLicenseActivity extends Activity {
-
     private static final String TAG = "SettingsLicenseActivity";
-    private static final boolean LOGV = false || false;
 
     private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
     private static final String PROPERTY_LICENSE_PATH = "ro.config.license_path";
 
-    private Handler mHandler;
-    private WebView mWebView;
-    private ProgressDialog mSpinnerDlg;
-    private AlertDialog mTextDlg;
-
-    private class LicenseFileLoader implements Runnable {
-
-        private static final String INNER_TAG = "SettingsLicenseActivity.LicenseFileLoader";
-        public static final int STATUS_OK = 0;
-        public static final int STATUS_NOT_FOUND = 1;
-        public static final int STATUS_READ_ERROR = 2;
-        public static final int STATUS_EMPTY_FILE = 3;
-
-        private String mFileName;
-        private Handler mHandler;
-
-        public LicenseFileLoader(String fileName, Handler handler) {
-            mFileName = fileName;
-            mHandler = handler;
-        }
-
-        public void run() {
-
-            int status = STATUS_OK;
-
-            InputStreamReader inputReader = null;
-            StringBuilder data = new StringBuilder(2048);
-            try {
-                char[] tmp = new char[2048];
-                int numRead;
-                if (mFileName.endsWith(".gz")) {
-                    inputReader = new InputStreamReader(
-                        new GZIPInputStream(new FileInputStream(mFileName)));
-                } else {
-                    inputReader = new FileReader(mFileName);
-                }
-
-                while ((numRead = inputReader.read(tmp)) >= 0) {
-                    data.append(tmp, 0, numRead);
-                }
-            } catch (FileNotFoundException e) {
-                Log.e(INNER_TAG, "License HTML file not found at " + mFileName, e);
-                status = STATUS_NOT_FOUND;
-            } catch (IOException e) {
-                Log.e(INNER_TAG, "Error reading license HTML file at " + mFileName, e);
-                status = STATUS_READ_ERROR;
-            } finally {
-                try {
-                    if (inputReader != null) {
-                        inputReader.close();
-                    }
-                } catch (IOException e) {
-                }
-            }
-
-            if ((status == STATUS_OK) && TextUtils.isEmpty(data)) {
-                Log.e(INNER_TAG, "License HTML is empty (from " + mFileName + ")");
-                status = STATUS_EMPTY_FILE;
-            }
-
-            // Tell the UI thread that we are finished.
-            Message msg = mHandler.obtainMessage(status, null);
-            if (status == STATUS_OK) {
-                msg.obj = data.toString();
-            }
-            mHandler.sendMessage(msg);
-        }
-    }
-
-    public SettingsLicenseActivity() {
-        super();
-        mHandler = null;
-        mWebView = null;
-        mSpinnerDlg = null;
-        mTextDlg = null;
-    }
-
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        String fileName = SystemProperties.get(PROPERTY_LICENSE_PATH, DEFAULT_LICENSE_PATH);
-        if (TextUtils.isEmpty(fileName)) {
-            Log.e(TAG, "The system property for the license file is empty.");
+        final String path = SystemProperties.get(PROPERTY_LICENSE_PATH, DEFAULT_LICENSE_PATH);
+        if (TextUtils.isEmpty(path)) {
+            Log.e(TAG, "The system property for the license file is empty");
             showErrorAndFinish();
             return;
         }
 
-        // The activity does not have any view itself,
-        // so set it invisible to avoid displaying the title text in the background.
-        setVisible(false);
-
-        mWebView = new WebView(this);
-
-        mHandler = new Handler() {
-
-            @Override
-            public void handleMessage(Message msg) {
-                super.handleMessage(msg);
-
-                if (msg.what == LicenseFileLoader.STATUS_OK) {
-                    String text = (String) msg.obj;
-                    showPageOfText(text);
-                } else {
-                    showErrorAndFinish();
-                }
-            }
-        };
-
-        CharSequence title = getText(R.string.settings_license_activity_title);
-        CharSequence msg = getText(R.string.settings_license_activity_loading);
-
-        ProgressDialog pd = ProgressDialog.show(this, title, msg, true, false);
-        pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
-        mSpinnerDlg = pd;
-
-        // Start separate thread to do the actual loading.
-        Thread thread = new Thread(new LicenseFileLoader(fileName, mHandler));
-        thread.start();
-    }
-
-    @Override
-    protected void onDestroy() {
-        if (mTextDlg != null && mTextDlg.isShowing()) {
-            mTextDlg.dismiss();
+        final File file = new File(path);
+        if (!file.exists() || file.length() == 0) {
+            Log.e(TAG, "License file " + path + " does not exist");
+            showErrorAndFinish();
+            return;
         }
-        if (mSpinnerDlg != null && mSpinnerDlg.isShowing()) {
-            mSpinnerDlg.dismiss();
+
+        // Kick off external viewer due to WebView security restrictions; we
+        // carefully point it at HTMLViewer, since it offers to decompress
+        // before viewing.
+        final Intent intent = new Intent(Intent.ACTION_VIEW);
+        intent.setDataAndType(Uri.fromFile(file), "text/html");
+        intent.putExtra(Intent.EXTRA_TITLE, getString(R.string.settings_license_activity_title));
+        intent.addCategory(Intent.CATEGORY_DEFAULT);
+        intent.setPackage("com.android.htmlviewer");
+
+        try {
+            startActivity(intent);
+            finish();
+        } catch (ActivityNotFoundException e) {
+            Log.e(TAG, "Failed to find viewer", e);
+            showErrorAndFinish();
         }
-        super.onDestroy();
-    }
-
-    private void showPageOfText(String text) {
-        // Create an AlertDialog to display the WebView in.
-        AlertDialog.Builder builder = new AlertDialog.Builder(SettingsLicenseActivity.this);
-        builder.setCancelable(true)
-               .setView(mWebView)
-               .setTitle(R.string.settings_license_activity_title);
-
-        mTextDlg = builder.create();
-        mTextDlg.setOnDismissListener(new OnDismissListener() {
-
-            public void onDismiss(DialogInterface dlgi) {
-                SettingsLicenseActivity.this.finish();
-            }
-        });
-
-        // Begin the loading.  This will be done in a separate thread in WebView.
-        mWebView.loadDataWithBaseURL(null, text, "text/html", "utf-8", null);
-        mWebView.setWebViewClient(new WebViewClient() {
-            @Override
-            public void onPageFinished(WebView view, String url) {
-                mSpinnerDlg.dismiss();
-                if (SettingsLicenseActivity.this.isResumed()) {
-                    mTextDlg.show();
-                }
-            }
-        });
-
-        mWebView = null;
     }
 
     private void showErrorAndFinish() {
-        mSpinnerDlg.dismiss();
-        mSpinnerDlg = null;
         Toast.makeText(this, R.string.settings_license_activity_unavailable, Toast.LENGTH_LONG)
                 .show();
         finish();
diff --git a/src/com/android/settings/SettingsSafetyLegalActivity.java b/src/com/android/settings/SettingsSafetyLegalActivity.java
deleted file mode 100644
index 368ee1d..0000000
--- a/src/com/android/settings/SettingsSafetyLegalActivity.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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.view.KeyEvent;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import com.android.internal.app.AlertActivity;
-import com.android.internal.app.AlertController;
-import android.content.DialogInterface;
-
-/**
- * The "dialog" that shows from "Safety information" in the Settings app.
- */
-public class SettingsSafetyLegalActivity extends AlertActivity 
-        implements DialogInterface.OnCancelListener, DialogInterface.OnClickListener {
-    private static final String PROPERTY_LSAFETYLEGAL_URL = "ro.url.safetylegal";
-
-    private WebView mWebView;
-
-    private AlertDialog mErrorDialog = null;
-
-    @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);
-
-        mWebView = new WebView(this);
-
-        // Begin accessing
-        mWebView.getSettings().setJavaScriptEnabled(true);
-        if (savedInstanceState == null) {
-            mWebView.loadUrl(userSafetylegalUrl);
-        } else {
-            mWebView.restoreState(savedInstanceState);
-        }
-        mWebView.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));
-            }
-
-            @Override
-            public void onReceivedError(WebView view, int errorCode,
-                    String description, String failingUrl) {
-                showErrorAndFinish(failingUrl);
-            }
-        });
-
-        final AlertController.AlertParams p = mAlertParams;
-        p.mTitle = getString(R.string.settings_safetylegal_activity_loading);
-        p.mView = mWebView;
-        p.mForceInverseBackground = true;
-        setupAlert();
-    }
-
-    private void showErrorAndFinish(String url) {
-        if (mErrorDialog == null) {
-            mErrorDialog = new AlertDialog.Builder(this)
-                    .setTitle(R.string.settings_safetylegal_activity_title)
-                    .setPositiveButton(android.R.string.ok, this)
-                    .setOnCancelListener(this)
-                    .setCancelable(true)
-                    .create();
-        } else {
-            if (mErrorDialog.isShowing()) {
-                mErrorDialog.dismiss();
-            }
-        }
-        mErrorDialog.setMessage(getResources()
-                .getString(R.string.settings_safetylegal_activity_unreachable, url));
-        mErrorDialog.show();
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-
-        if (mErrorDialog != null) {
-            mErrorDialog.dismiss();
-            mErrorDialog = null;
-        }
-    }
-
-    @Override
-    public boolean dispatchKeyEvent(KeyEvent event) {
-        if (event.getKeyCode() == KeyEvent.KEYCODE_BACK 
-                && event.getAction() == KeyEvent.ACTION_DOWN) {
-            if (mWebView.canGoBack()) {
-                mWebView.goBack();
-                return true;
-            }
-        }
-        return super.dispatchKeyEvent(event);
-    }
-
-    public void onClick(DialogInterface dialog, int whichButton) {
-        finish();
-    }
-
-    public void onCancel(DialogInterface dialog) {
-        finish();
-    }
-
-    @Override
-    public void onSaveInstanceState(Bundle icicle) {
-        mWebView.saveState(icicle);
-        super.onSaveInstanceState(icicle);
-    }
-}
diff --git a/src/com/android/settings/TetherSettings.java b/src/com/android/settings/TetherSettings.java
index c611772..230bbb2 100644
--- a/src/com/android/settings/TetherSettings.java
+++ b/src/com/android/settings/TetherSettings.java
@@ -16,11 +16,7 @@
 
 package com.android.settings;
 
-import com.android.settings.wifi.WifiApEnabler;
-import com.android.settings.wifi.WifiApDialog;
-
 import android.app.Activity;
-import android.app.AlertDialog;
 import android.app.Dialog;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothPan;
@@ -31,7 +27,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
-import android.content.res.AssetManager;
 import android.hardware.usb.UsbManager;
 import android.net.ConnectivityManager;
 import android.net.wifi.WifiConfiguration;
@@ -44,16 +39,13 @@
 import android.preference.Preference;
 import android.preference.PreferenceScreen;
 import android.preference.SwitchPreference;
-import android.text.TextUtils;
-import android.view.ViewGroup;
-import android.view.ViewParent;
-import android.webkit.WebView;
 import android.widget.TextView;
 
-import java.io.InputStream;
+import com.android.settings.wifi.WifiApDialog;
+import com.android.settings.wifi.WifiApEnabler;
+
 import java.util.ArrayList;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.Locale;
 
 /*
  * Displays preferences for Tethering.
@@ -69,7 +61,6 @@
 
     private static final int DIALOG_AP_SETTINGS = 1;
 
-    private WebView mView;
     private SwitchPreference mUsbTether;
 
     private WifiApEnabler mWifiApEnabler;
@@ -182,8 +173,6 @@
 
         mProvisionApp = getResources().getStringArray(
                 com.android.internal.R.array.config_mobile_hotspot_provision_app);
-
-        mView = new WebView(activity);
     }
 
     @Override
