diff --git a/res/values/strings.xml b/res/values/strings.xml
index 1e5cd14..8c3532d 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -7696,19 +7696,19 @@
     <string name="double_twist_for_camera_mode_title">Flip camera</string>
 
     <!-- Summary text for double twist for camera mode  [CHAR LIMIT=160]-->
-    <string name="double_twist_for_camera_mode_summary">To switch between front and back cameras, double-twist</string>
+    <string name="double_twist_for_camera_mode_summary"></string>
 
     <!-- Title text for ambient display [CHAR LIMIT=60]-->
     <string name="ambient_display_title">Quick screen check</string>
 
     <!-- Summary text for ambient display [CHAR LIMIT=160]-->
-    <string name="ambient_display_summary">To check your phone without waking it up, double-tap the screen or raise the device</string>
+    <string name="ambient_display_summary">To check your phone without waking it up fully, double-tap it or pick it up</string>
 
     <!-- Title text for fingerprint swipe for notifications [CHAR LIMIT=60]-->
     <string name="fingerprint_swipe_for_notifications_title">Swipe for notifications</string>
 
     <!-- Summary text for fingerprint swipe for notifications [CHAR LIMIT=160]-->
-    <string name="fingerprint_swipe_for_notifications_summary">To check your notifications from any screen, swipe down on the fingerprint sensor</string>
+    <string name="fingerprint_swipe_for_notifications_summary">To check your notifications, swipe down on the fingerprint sensor on the back of your phone</string>
 
     <!-- Switch text for each gesture setting state -->
     <string name="gesture_setting_on">On</string>
diff --git a/src/com/android/settings/AppListPreference.java b/src/com/android/settings/AppListPreference.java
index 61b4260..1ebeeaa 100644
--- a/src/com/android/settings/AppListPreference.java
+++ b/src/com/android/settings/AppListPreference.java
@@ -32,6 +32,7 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -265,6 +266,24 @@
         }
     }
 
+    /**
+     * Sets app label as summary if there is only 1 app applicable to this preference.
+     */
+    protected void setSoleAppLabelAsSummary() {
+        final CharSequence soleLauncherLabel = getSoleAppLabel();
+        if (!TextUtils.isEmpty(soleLauncherLabel)) {
+            setSummary(soleLauncherLabel);
+        }
+    }
+
+    /**
+     * Returns app label if there is only 1 app applicable to this preference.
+     */
+    protected CharSequence getSoleAppLabel() {
+        // Intentionally left empty so subclasses can override with necessary logic.
+        return null;
+    }
+
     private static class SavedState implements Parcelable {
 
         public final CharSequence[] entryValues;
diff --git a/src/com/android/settings/applications/DefaultBrowserPreference.java b/src/com/android/settings/applications/DefaultBrowserPreference.java
index d25e224..9d84e1e 100644
--- a/src/com/android/settings/applications/DefaultBrowserPreference.java
+++ b/src/com/android/settings/applications/DefaultBrowserPreference.java
@@ -26,6 +26,7 @@
 import android.text.TextUtils;
 import android.util.AttributeSet;
 import android.util.Log;
+
 import com.android.internal.content.PackageMonitor;
 import com.android.settings.AppListPreference;
 import com.android.settings.R;
@@ -36,12 +37,16 @@
 public class DefaultBrowserPreference extends AppListPreference {
 
     private static final String TAG = "DefaultBrowserPref";
+    private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
 
     private static final long DELAY_UPDATE_BROWSER_MILLIS = 500;
+    private static final Intent BROWSE_PROBE = new Intent()
+            .setAction(Intent.ACTION_VIEW)
+            .addCategory(Intent.CATEGORY_BROWSABLE)
+            .setData(Uri.parse("http:"));
 
     private final Handler mHandler = new Handler();
-
-    final private PackageManager mPm;
+    private final PackageManager mPm;
 
     public DefaultBrowserPreference(Context context, AttributeSet attrs) {
         super(context, attrs);
@@ -65,11 +70,7 @@
 
     @Override
     protected boolean persistString(String newValue) {
-
-        if (newValue == null) {
-            return false;
-        }
-        final CharSequence packageName = (CharSequence) newValue;
+        final CharSequence packageName = newValue;
         if (TextUtils.isEmpty(packageName)) {
             return false;
         }
@@ -95,13 +96,10 @@
         String packageName = pm.getDefaultBrowserPackageNameAsUser(mUserId);
         if (!TextUtils.isEmpty(packageName)) {
             // Check if the default Browser package is still there
-            Intent intent = new Intent();
-            intent.setPackage(packageName);
-            intent.setAction(Intent.ACTION_VIEW);
-            intent.addCategory(Intent.CATEGORY_BROWSABLE);
-            intent.setData(Uri.parse("http:"));
+            final Intent intent = new Intent(BROWSE_PROBE)
+                    .setPackage(packageName);
 
-            ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, mUserId);
+            final ResolveInfo info = mPm.resolveActivityAsUser(intent, 0, mUserId);
             if (info != null) {
                 setValue(packageName);
                 setSummary("%s");
@@ -109,26 +107,20 @@
                 setSummary(R.string.default_browser_title_none);
             }
         } else {
-            setSummary(R.string.default_browser_title_none);
-            Log.d(TAG, "Cannot set empty default Browser value!");
+            if (DEBUG) Log.d(TAG, "No default browser app.");
+            setSoleAppLabelAsSummary();
         }
     }
 
     private List<String> resolveBrowserApps() {
         List<String> result = new ArrayList<>();
 
-        // Create an Intent that will match ALL Browser Apps
-        Intent intent = new Intent();
-        intent.setAction(Intent.ACTION_VIEW);
-        intent.addCategory(Intent.CATEGORY_BROWSABLE);
-        intent.setData(Uri.parse("http:"));
-
         // Resolve that intent and check that the handleAllWebDataURI boolean is set
-        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(intent, PackageManager.MATCH_ALL,
-                mUserId);
+        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(BROWSE_PROBE,
+                PackageManager.MATCH_ALL, mUserId);
 
         final int count = list.size();
-        for (int i=0; i<count; i++) {
+        for (int i = 0; i < count; i++) {
             ResolveInfo info = list.get(i);
             if (info.activityInfo == null || result.contains(info.activityInfo.packageName)
                     || !info.handleAllWebDataURI) {
@@ -141,6 +133,17 @@
         return result;
     }
 
+    @Override
+    protected CharSequence getSoleAppLabel() {
+        // Resolve that intent and check that the handleAllWebDataURI boolean is set
+        List<ResolveInfo> list = mPm.queryIntentActivitiesAsUser(BROWSE_PROBE,
+                PackageManager.MATCH_ALL, mUserId);
+        if (list.size() == 1) {
+            return list.get(0).loadLabel(mPm);
+        }
+        return null;
+    }
+
     private final Runnable mUpdateRunnable = new Runnable() {
         @Override
         public void run() {
diff --git a/src/com/android/settings/applications/DefaultHomePreference.java b/src/com/android/settings/applications/DefaultHomePreference.java
index 9f4a913..46fba66 100644
--- a/src/com/android/settings/applications/DefaultHomePreference.java
+++ b/src/com/android/settings/applications/DefaultHomePreference.java
@@ -26,6 +26,7 @@
 import android.os.Build;
 import android.os.UserManager;
 import android.util.AttributeSet;
+
 import com.android.settings.AppListPreference;
 import com.android.settings.R;
 
@@ -36,9 +37,11 @@
 
     private final ArrayList<ComponentName> mAllHomeComponents = new ArrayList<>();
     private final IntentFilter mHomeFilter;
+    private final String mPackageName;
 
     public DefaultHomePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
+        mPackageName = getContext().getPackageName();
         mHomeFilter = new IntentFilter(Intent.ACTION_MAIN);
         mHomeFilter.addCategory(Intent.CATEGORY_HOME);
         mHomeFilter.addCategory(Intent.CATEGORY_DEFAULT);
@@ -59,26 +62,44 @@
                     IntentFilter.MATCH_CATEGORY_EMPTY,
                     mAllHomeComponents.toArray(new ComponentName[0]), component);
             setSummary(getEntry());
+        } else {
+            // If there is only 1 launcher, use its label as summary text.
+            setSoleAppLabelAsSummary();
         }
         return super.persistString(value);
     }
 
+    @Override
+    protected CharSequence getSoleAppLabel() {
+        final PackageManager pm = getContext().getPackageManager();
+        final List<ResolveInfo> homeActivities = new ArrayList<>();
+        final List<CharSequence> appLabels = new ArrayList<>();
+
+        pm.getHomeActivities(homeActivities);
+        for (ResolveInfo candidate : homeActivities) {
+            final ActivityInfo info = candidate.activityInfo;
+            if (info.packageName.equals(mPackageName)) {
+                continue;
+            }
+            appLabels.add(info.loadLabel(pm));
+        }
+        return appLabels.size() == 1 ? appLabels.get(0) : null;
+    }
+
     public void refreshHomeOptions() {
-        final String myPkg = getContext().getPackageName();
-        ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
+        ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
         PackageManager pm = getContext().getPackageManager();
-        ComponentName currentDefaultHome  = pm.getHomeActivities(homeActivities);
+        ComponentName currentDefaultHome = pm.getHomeActivities(homeActivities);
         ArrayList<ComponentName> components = new ArrayList<>();
         mAllHomeComponents.clear();
         List<CharSequence> summaries = new ArrayList<>();
 
         boolean mustSupportManagedProfile = hasManagedProfile();
-        for (int i = 0; i < homeActivities.size(); i++) {
-            final ResolveInfo candidate = homeActivities.get(i);
+        for (ResolveInfo candidate : homeActivities) {
             final ActivityInfo info = candidate.activityInfo;
             ComponentName activityName = new ComponentName(info.packageName, info.name);
             mAllHomeComponents.add(activityName);
-            if (info.packageName.equals(myPkg)) {
+            if (info.packageName.equals(mPackageName)) {
                 continue;
             }
             components.add(activityName);
diff --git a/src/com/android/settings/dashboard/SuggestionsChecks.java b/src/com/android/settings/dashboard/SuggestionsChecks.java
index 5f140ba..5b8638a 100644
--- a/src/com/android/settings/dashboard/SuggestionsChecks.java
+++ b/src/com/android/settings/dashboard/SuggestionsChecks.java
@@ -21,6 +21,7 @@
 import android.app.KeyguardManager;
 import android.app.NotificationManager;
 import android.app.WallpaperManager;
+import android.app.admin.DevicePolicyManager;
 import android.content.Context;
 import android.hardware.fingerprint.FingerprintManager;
 import android.os.Bundle;
@@ -59,10 +60,11 @@
         } else if (className.equals(WifiCallingSuggestionActivity.class.getName())) {
             return isWifiCallingUnavailableOrEnabled();
         } else if (className.equals(FingerprintSuggestionActivity.class.getName())) {
-            return isNotSingleFingerprintEnrolled();
-        } else if (className.equals(ScreenLockSuggestionActivity.class.getName())
-                || className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
+            return isNotSingleFingerprintEnrolled() || !isFingerprintEnabled();
+        } else if (className.equals(ScreenLockSuggestionActivity.class.getName())) {
             return isDeviceSecured();
+        } else if (className.equals(FingerprintEnrollSuggestionActivity.class.getName())) {
+            return isDeviceSecured() || !isFingerprintEnabled();
         }
         return false;
     }
@@ -108,6 +110,14 @@
         return false;
     }
 
+    private boolean isFingerprintEnabled() {
+        DevicePolicyManager dpManager =
+                (DevicePolicyManager) mContext.getSystemService(Context.DEVICE_POLICY_SERVICE);
+        final int dpmFlags = dpManager.getKeyguardDisabledFeatures(null, /* admin */
+                mContext.getUserId());
+        return (dpmFlags & DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT) == 0;
+    }
+
     private final IWallpaperManagerCallback mCallback = new IWallpaperManagerCallback.Stub() {
         @Override
         public void onWallpaperChanged() throws RemoteException {
