diff --git a/src/com/android/settings/Utils.java b/src/com/android/settings/Utils.java
index d25d8c3..d2d04ec 100644
--- a/src/com/android/settings/Utils.java
+++ b/src/com/android/settings/Utils.java
@@ -1146,9 +1146,9 @@
         boolean hasPreferred = hasPreferredActivities(pm, packageName)
                 || hasUsbDefaults(usbManager, packageName);
         int status = pm.getIntentVerificationStatus(packageName, UserHandle.myUserId());
+        // consider a visible current link-handling state to be any explicitly designated behavior
         boolean hasDomainURLsPreference =
-                (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS) ||
-                (status == PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+                status != PackageManager.INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
         return context.getString(hasPreferred || hasDomainURLsPreference
                 ? R.string.launch_defaults_some
                 : R.string.launch_defaults_none);
diff --git a/src/com/android/settings/applications/AppLaunchSettings.java b/src/com/android/settings/applications/AppLaunchSettings.java
index c885b02..6c2f241 100644
--- a/src/com/android/settings/applications/AppLaunchSettings.java
+++ b/src/com/android/settings/applications/AppLaunchSettings.java
@@ -17,14 +17,16 @@
 package com.android.settings.applications;
 
 import android.app.AlertDialog;
+import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IntentFilterVerificationInfo;
 import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.net.Uri;
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.preference.Preference;
-import android.preference.SwitchPreference;
 import android.util.ArraySet;
 import android.util.Log;
 import android.view.View;
@@ -52,8 +54,17 @@
     private static final String KEY_SUPPORTED_DOMAIN_URLS = "app_launch_supported_domain_urls";
     private static final String KEY_CLEAR_DEFAULTS = "app_launch_clear_defaults";
 
+    private static final Intent sBrowserIntent;
+    static {
+        sBrowserIntent = new Intent()
+                .setAction(Intent.ACTION_VIEW)
+                .addCategory(Intent.CATEGORY_BROWSABLE)
+                .setData(Uri.parse("http:"));
+    }
+
     private PackageManager mPm;
 
+    private boolean mIsBrowser;
     private boolean mHasDomainUrls;
     private DropDownPreference mAppLinkState;
     private AppDomainsPreference mAppDomainUrls;
@@ -64,62 +75,91 @@
         super.onCreate(savedInstanceState);
 
         addPreferencesFromResource(R.xml.installed_app_launch_settings);
+        mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
+        mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
+        mAppLinkState = (DropDownPreference) findPreference(KEY_APP_LINK_STATE);
 
         mPm = getActivity().getPackageManager();
 
+        mIsBrowser = isBrowserApp(mPackageName);
         mHasDomainUrls =
                 (mAppEntry.info.privateFlags & ApplicationInfo.PRIVATE_FLAG_HAS_DOMAIN_URLS) != 0;
-        List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
 
-        List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
-
-        mAppDomainUrls = (AppDomainsPreference) findPreference(KEY_SUPPORTED_DOMAIN_URLS);
-        CharSequence[] entries = getEntries(mPackageName, iviList, filters);
-        mAppDomainUrls.setTitles(entries);
-        mAppDomainUrls.setValues(new int[entries.length]);
-
-        mClearDefaultsPreference = (ClearDefaultsPreference) findPreference(KEY_CLEAR_DEFAULTS);
-
+        if (!mIsBrowser) {
+            List<IntentFilterVerificationInfo> iviList = mPm.getIntentFilterVerifications(mPackageName);
+            List<IntentFilter> filters = mPm.getAllIntentFilters(mPackageName);
+            CharSequence[] entries = getEntries(mPackageName, iviList, filters);
+            mAppDomainUrls.setTitles(entries);
+            mAppDomainUrls.setValues(new int[entries.length]);
+        }
         buildStateDropDown();
     }
 
+    // An app is a "browser" if it has an activity resolution that wound up
+    // marked with the 'handleAllWebDataURI' flag.
+    private boolean isBrowserApp(String packageName) {
+        sBrowserIntent.setPackage(packageName);
+        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(sBrowserIntent,
+                PackageManager.MATCH_ALL, UserHandle.myUserId());
+        final int count = list.size();
+        for (int i = 0; i < count; i++) {
+            ResolveInfo info = list.get(i);
+            if (info.activityInfo != null && info.handleAllWebDataURI) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     private void buildStateDropDown() {
-        mAppLinkState = (DropDownPreference) findPreference(KEY_APP_LINK_STATE);
+        if (mIsBrowser) {
+            // Browsers don't show the app-link prefs
+            mAppLinkState.setShouldDisableView(true);
+            mAppLinkState.setEnabled(false);
+            mAppDomainUrls.setShouldDisableView(true);
+            mAppDomainUrls.setEnabled(false);
+        } else {
+            // Designed order of states in the dropdown:
+            //
+            // * always
+            // * ask
+            // * never
+            mAppLinkState.addItem(R.string.app_link_open_always,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
+            mAppLinkState.addItem(R.string.app_link_open_ask,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
+            mAppLinkState.addItem(R.string.app_link_open_never,
+                    INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
 
-        // Designed order of states in the dropdown:
-        //
-        // * always
-        // * ask
-        // * never
-        mAppLinkState.addItem(R.string.app_link_open_always,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS);
-        mAppLinkState.addItem(R.string.app_link_open_ask,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK);
-        mAppLinkState.addItem(R.string.app_link_open_never,
-                INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_NEVER);
+            mAppLinkState.setEnabled(mHasDomainUrls);
+            if (mHasDomainUrls) {
+                // Present 'undefined' as 'ask' because the OS treats them identically for
+                // purposes of the UI (and does the right thing around pending domain
+                // verifications that might arrive after the user chooses 'ask' in this UI).
+                final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
+                mAppLinkState.setSelectedValue(
+                        (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
+                            ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK
+                            : state);
 
-        mAppLinkState.setEnabled(mHasDomainUrls);
-        if (mHasDomainUrls) {
-            // Present 'undefined' as 'ask' because the OS treats them identically for
-            // purposes of the UI (and does the right thing around pending domain
-            // verifications that might arrive after the user chooses 'ask' in this UI).
-            final int state = mPm.getIntentVerificationStatus(mPackageName, UserHandle.myUserId());
-            mAppLinkState.setSelectedValue(
-                    (state == INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED)
-                        ? INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_ALWAYS_ASK
-                        : state);
-
-            // Set the callback only after setting the initial selected item
-            mAppLinkState.setCallback(new Callback() {
-                @Override
-                public boolean onItemSelected(int pos, Object value) {
-                    return updateAppLinkState((Integer) value);
-                }
-            });
+                // Set the callback only after setting the initial selected item
+                mAppLinkState.setCallback(new Callback() {
+                    @Override
+                    public boolean onItemSelected(int pos, Object value) {
+                        return updateAppLinkState((Integer) value);
+                    }
+                });
+            }
         }
     }
 
     private boolean updateAppLinkState(final int newState) {
+        if (mIsBrowser) {
+            // We shouldn't get into this state, but if we do make sure
+            // not to cause any permanent mayhem.
+            return false;
+        }
+
         final int userId = UserHandle.myUserId();
         final int priorState = mPm.getIntentVerificationStatus(mPackageName, userId);
 
diff --git a/src/com/android/settings/applications/ClearDefaultsPreference.java b/src/com/android/settings/applications/ClearDefaultsPreference.java
index 8be4be0..bcb6a8a 100644
--- a/src/com/android/settings/applications/ClearDefaultsPreference.java
+++ b/src/com/android/settings/applications/ClearDefaultsPreference.java
@@ -93,9 +93,13 @@
             @Override
             public void onClick(View v) {
                 if (mUsbManager != null) {
+                    final int userId = UserHandle.myUserId();
                     mPm.clearPackagePreferredActivities(mPackageName);
+                    if (isDefaultBrowser(mPackageName)) {
+                        mPm.setDefaultBrowserPackageName(null, userId);
+                    }
                     try {
-                        mUsbManager.clearDefaults(mPackageName, UserHandle.myUserId());
+                        mUsbManager.clearDefaults(mPackageName, userId);
                     } catch (RemoteException e) {
                         Log.e(TAG, "mUsbManager.clearDefaults", e);
                     }
@@ -122,6 +126,7 @@
 
         TextView autoLaunchView = (TextView) mRootView.findViewById(R.id.auto_launch);
         boolean autoLaunchEnabled = Utils.hasPreferredActivities(mPm, mPackageName)
+                || isDefaultBrowser(mPackageName)
                 || Utils.hasUsbDefaults(mUsbManager, mPackageName);
         if (!autoLaunchEnabled && !hasBindAppWidgetPermission) {
             resetLaunchDefaultsUi(autoLaunchView);
@@ -165,6 +170,11 @@
         return true;
     }
 
+    private boolean isDefaultBrowser(String packageName) {
+        final String defaultBrowser = mPm.getDefaultBrowserPackageName(UserHandle.myUserId());
+        return packageName.equals(defaultBrowser);
+    }
+
     private void resetLaunchDefaultsUi(TextView autoLaunchView) {
         autoLaunchView.setText(R.string.auto_launch_disable_text);
         // Disable clear activities button
