diff --git a/src/com/android/settings/DeviceAdminSettings.java b/src/com/android/settings/DeviceAdminSettings.java
index 4ae900a..00f4d9c 100644
--- a/src/com/android/settings/DeviceAdminSettings.java
+++ b/src/com/android/settings/DeviceAdminSettings.java
@@ -49,6 +49,7 @@
 import android.widget.TextView;
 
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.instrumentation.Instrumentable;
 import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
 
@@ -136,6 +137,9 @@
         super.onActivityCreated(savedInstanceState);
         setHasOptionsMenu(true);
         Utils.forceCustomPadding(getListView(), true /* additive padding */);
+        if (InstrumentedPreferenceFragment.usePreferenceScreenTitle()) {
+            getActivity().setTitle(R.string.manage_device_admin);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/MasterClear.java b/src/com/android/settings/MasterClear.java
index 2c97018..bac0a61 100644
--- a/src/com/android/settings/MasterClear.java
+++ b/src/com/android/settings/MasterClear.java
@@ -21,6 +21,7 @@
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorDescription;
+import android.annotation.StringRes;
 import android.app.Activity;
 import android.content.ComponentName;
 import android.content.ContentResolver;
@@ -91,6 +92,12 @@
         }
     };
 
+    @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.master_clear_title;
+    }
+
     /**
      * Keyguard validation is run using the standard {@link ConfirmLockPattern}
      * component as a subactivity
diff --git a/src/com/android/settings/ResetNetwork.java b/src/com/android/settings/ResetNetwork.java
index 1529e77..b5b8a18 100644
--- a/src/com/android/settings/ResetNetwork.java
+++ b/src/com/android/settings/ResetNetwork.java
@@ -16,6 +16,7 @@
 
 package com.android.settings;
 
+import android.annotation.StringRes;
 import android.app.Activity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -63,6 +64,12 @@
     private Spinner mSubscriptionSpinner;
     private Button mInitiateButton;
 
+    @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.reset_network_title;
+    }
+
     /**
      * Keyguard validation is run using the standard {@link ConfirmLockPattern}
      * component as a subactivity
diff --git a/src/com/android/settings/ScreenPinningSettings.java b/src/com/android/settings/ScreenPinningSettings.java
index 5209cc7..68050b1 100644
--- a/src/com/android/settings/ScreenPinningSettings.java
+++ b/src/com/android/settings/ScreenPinningSettings.java
@@ -65,6 +65,9 @@
         super.onActivityCreated(savedInstanceState);
 
         final SettingsActivity activity = (SettingsActivity) getActivity();
+        if (usePreferenceScreenTitle()) {
+            activity.setTitle(R.string.screen_pinning_title);
+        }
         mLockPatternUtils = new LockPatternUtils(activity);
 
 
diff --git a/src/com/android/settings/TrustedCredentialsSettings.java b/src/com/android/settings/TrustedCredentialsSettings.java
index 587e814..12524b9 100644
--- a/src/com/android/settings/TrustedCredentialsSettings.java
+++ b/src/com/android/settings/TrustedCredentialsSettings.java
@@ -20,6 +20,7 @@
 import static android.widget.LinearLayout.LayoutParams.WRAP_CONTENT;
 
 import android.animation.LayoutTransition;
+import android.annotation.StringRes;
 import android.annotation.UiThread;
 import android.app.Activity;
 import android.app.KeyguardManager;
@@ -91,6 +92,12 @@
     private static final int REQUEST_CONFIRM_CREDENTIALS = 1;
 
     @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.trusted_credentials;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsEvent.TRUSTED_CREDENTIALS;
     }
diff --git a/src/com/android/settings/UserCredentialsSettings.java b/src/com/android/settings/UserCredentialsSettings.java
index 6cf1ae0..f34b7a7 100644
--- a/src/com/android/settings/UserCredentialsSettings.java
+++ b/src/com/android/settings/UserCredentialsSettings.java
@@ -18,6 +18,7 @@
 
 import android.annotation.LayoutRes;
 import android.annotation.Nullable;
+import android.annotation.StringRes;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.DialogFragment;
@@ -84,6 +85,12 @@
         }
     }
 
+    @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.user_credentials;
+    }
+
     protected void announceRemoval(String alias) {
         if (!isAdded()) {
             return;
diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java
index fd48c39..0fbf5fa 100644
--- a/src/com/android/settings/accessibility/AccessibilitySettings.java
+++ b/src/com/android/settings/accessibility/AccessibilitySettings.java
@@ -20,6 +20,7 @@
 import android.app.admin.DevicePolicyManager;
 import android.content.ComponentName;
 import android.content.Context;
+import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
@@ -118,6 +119,7 @@
     static final String EXTRA_PREFERENCE_KEY = "preference_key";
     static final String EXTRA_CHECKED = "checked";
     static final String EXTRA_TITLE = "title";
+    static final String EXTRA_RESOLVE_INFO = "resolve_info";
     static final String EXTRA_SUMMARY = "summary";
     static final String EXTRA_SETTINGS_TITLE = "settings_title";
     static final String EXTRA_COMPONENT_NAME = "component_name";
@@ -464,23 +466,23 @@
         }
 
         for (int i = 0, count = installedServices.size(); i < count; ++i) {
-            AccessibilityServiceInfo info = installedServices.get(i);
+            final AccessibilityServiceInfo info = installedServices.get(i);
+            final ResolveInfo resolveInfo = info.getResolveInfo();
 
             RestrictedPreference preference =
                     new RestrictedPreference(downloadedServicesCategory.getContext());
-            String title = info.getResolveInfo().loadLabel(getPackageManager()).toString();
+            final String title = resolveInfo.loadLabel(getPackageManager()).toString();
 
             Drawable icon;
-            if (info.getResolveInfo().getIconResource() == 0) {
+            if (resolveInfo.getIconResource() == 0) {
                 icon = ContextCompat.getDrawable(getContext(), R.mipmap.ic_accessibility_generic);
             } else {
-                icon = info.getResolveInfo().loadIcon(getPackageManager());
+                icon = resolveInfo.loadIcon(getPackageManager());
             }
 
-            ServiceInfo serviceInfo = info.getResolveInfo().serviceInfo;
+            ServiceInfo serviceInfo = resolveInfo.serviceInfo;
             String packageName = serviceInfo.packageName;
             ComponentName componentName = new ComponentName(packageName, serviceInfo.name);
-            String componentNameKey = componentName.flattenToString();
 
             preference.setKey(componentName.flattenToString());
 
@@ -520,6 +522,9 @@
             extras.putString(EXTRA_PREFERENCE_KEY, preference.getKey());
             extras.putBoolean(EXTRA_CHECKED, serviceEnabled);
             extras.putString(EXTRA_TITLE, title);
+            if (usePreferenceScreenTitle()) {
+                extras.putParcelable(EXTRA_RESOLVE_INFO, resolveInfo);
+            }
 
             String description = info.loadDescription(getPackageManager());
             if (TextUtils.isEmpty(description)) {
diff --git a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
index 4e95cad..0f6bdd7 100644
--- a/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/AccessibilityShortcutPreferenceFragment.java
@@ -24,7 +24,6 @@
 import android.provider.Settings;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
-import android.text.TextUtils;
 import android.view.accessibility.AccessibilityManager;
 import android.widget.Switch;
 
@@ -60,7 +59,9 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        addPreferencesFromResource(R.xml.accessibility_shortcut_settings);
+        if (!usePreferenceScreenTitle()) {
+            addPreferencesFromResource(R.xml.accessibility_shortcut_settings);
+        }
         mServicePreference = findPreference(SHORTCUT_SERVICE_KEY);
         mOnLockScreenSwitchPreference = (SwitchPreference) findPreference(ON_LOCK_SCREEN_KEY);
         mOnLockScreenSwitchPreference.setOnPreferenceChangeListener((Preference p, Object o) -> {
@@ -80,6 +81,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.accessibility_shortcut_settings;
+    }
+
+    @Override
     protected void onInstallSwitchBarToggleSwitch() {
         super.onInstallSwitchBarToggleSwitch();
         mSwitchBar.addOnSwitchChangeListener((Switch switchView, boolean enabled) -> {
diff --git a/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java b/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
index f66a5e2..5b0e76d 100644
--- a/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
+++ b/src/com/android/settings/accessibility/ShortcutServicePickerFragment.java
@@ -34,6 +34,7 @@
 import android.view.accessibility.AccessibilityManager;
 
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.settings.R;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
@@ -54,6 +55,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.accessibility_shortcut_service_settings;
+    }
+
+    @Override
     protected List<? extends DefaultAppInfo> getCandidates() {
         final Context context = getContext();
         final AccessibilityManager accessibilityManager = context
diff --git a/src/com/android/settings/accessibility/ToggleAutoclickPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleAutoclickPreferenceFragment.java
index 16df03e..5fa38e1 100644
--- a/src/com/android/settings/accessibility/ToggleAutoclickPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleAutoclickPreferenceFragment.java
@@ -110,10 +110,17 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.accessibility_autoclick_settings;
+    }
+
+    @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        addPreferencesFromResource(R.xml.accessibility_autoclick_settings);
+        if (!usePreferenceScreenTitle()) {
+            addPreferencesFromResource(R.xml.accessibility_autoclick_settings);
+        }
 
         int delay = Settings.Secure.getInt(
                 getContentResolver(), Settings.Secure.ACCESSIBILITY_AUTOCLICK_DELAY,
@@ -153,7 +160,9 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        setTitle(getString(R.string.accessibility_autoclick_preference_title));
+        if (!usePreferenceScreenTitle()) {
+            setTitle(getString(R.string.accessibility_autoclick_preference_title));
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
index 64d38af..6ee7217 100644
--- a/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleDaltonizerPreferenceFragment.java
@@ -50,7 +50,9 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        addPreferencesFromResource(R.xml.accessibility_daltonizer_settings);
+        if (!usePreferenceScreenTitle()) {
+            addPreferencesFromResource(R.xml.accessibility_daltonizer_settings);
+        }
 
         mType = (ListPreference) findPreference("type");
 
@@ -62,6 +64,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.accessibility_daltonizer_settings;
+    }
+
+    @Override
     protected void onPreferenceToggled(String preferenceKey, boolean enabled) {
         Settings.Secure.putInt(getContentResolver(), ENABLED, enabled ? 1 : 0);
     }
@@ -80,7 +87,9 @@
     public void onViewCreated(View view, Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
 
-        setTitle(getString(R.string.accessibility_display_daltonizer_preference_title));
+        if (!usePreferenceScreenTitle()) {
+            setTitle(getString(R.string.accessibility_display_daltonizer_preference_title));
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
index f66fb4d..213e585 100644
--- a/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFeaturePreferenceFragment.java
@@ -17,6 +17,7 @@
 package com.android.settings.accessibility;
 
 import android.content.Intent;
+import android.content.pm.ResolveInfo;
 import android.os.Bundle;
 import android.support.v7.preference.Preference;
 import android.support.v7.preference.PreferenceScreen;
@@ -49,9 +50,14 @@
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(
-                getActivity());
-        setPreferenceScreen(preferenceScreen);
+        final int resId = getPreferenceScreenResId();
+        if (usePreferenceScreenTitle() && resId > 0) {
+            addPreferencesFromResource(resId);
+        } else {
+            PreferenceScreen preferenceScreen = getPreferenceManager().createPreferenceScreen(
+                    getActivity());
+            setPreferenceScreen(preferenceScreen);
+        }
     }
 
     @Override
@@ -98,6 +104,13 @@
         // Implement this to reset a checked listener.
     }
 
+    /**
+     * Get the res id for static preference xml for this fragment.
+     */
+    protected int getPreferenceScreenResId() {
+        return -1;
+    }
+
     private void installActionBarToggleSwitch() {
         mSwitchBar.show();
         onInstallSwitchBarToggleSwitch();
@@ -124,7 +137,11 @@
         }
 
         // Title.
-        if (arguments.containsKey(AccessibilitySettings.EXTRA_TITLE)) {
+        if (usePreferenceScreenTitle()
+                && arguments.containsKey(AccessibilitySettings.EXTRA_RESOLVE_INFO)) {
+            ResolveInfo info = arguments.getParcelable(AccessibilitySettings.EXTRA_RESOLVE_INFO);
+            getActivity().setTitle(info.loadLabel(getPackageManager()).toString());
+        } else if (arguments.containsKey(AccessibilitySettings.EXTRA_TITLE)) {
             setTitle(arguments.getString(AccessibilitySettings.EXTRA_TITLE));
         }
 
diff --git a/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java b/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java
index c200d17..dbd269a 100644
--- a/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java
+++ b/src/com/android/settings/accessibility/ToggleFontSizePreferenceFragment.java
@@ -17,6 +17,7 @@
 package com.android.settings.accessibility;
 
 import android.annotation.Nullable;
+import android.annotation.StringRes;
 import android.content.ContentResolver;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -55,6 +56,12 @@
     }
 
     @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.title_font_size;
+    }
+
+    @Override
     protected Configuration createConfig(Configuration origConfig, int index) {
         // Populate the sample layouts.
         final Configuration config = new Configuration(origConfig);
diff --git a/src/com/android/settings/applications/BackgroundCheckSummary.java b/src/com/android/settings/applications/BackgroundCheckSummary.java
index dd5c89c..1b8a787 100644
--- a/src/com/android/settings/applications/BackgroundCheckSummary.java
+++ b/src/com/android/settings/applications/BackgroundCheckSummary.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.applications;
 
+import android.annotation.StringRes;
 import android.app.FragmentTransaction;
 import android.os.Bundle;
 import android.preference.PreferenceFrameLayout;
@@ -57,4 +58,11 @@
 
         return rootView;
     }
+
+    @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.background_check_pref;
+    }
+
 }
diff --git a/src/com/android/settings/applications/ConvertToFbe.java b/src/com/android/settings/applications/ConvertToFbe.java
index c5e6d77..192cd14 100644
--- a/src/com/android/settings/applications/ConvertToFbe.java
+++ b/src/com/android/settings/applications/ConvertToFbe.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.applications;
 
+import android.annotation.Nullable;
 import android.app.Activity;
 import android.content.Intent;
 import android.content.res.Resources;
@@ -28,6 +29,7 @@
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.InstrumentedFragment;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.password.ChooseLockSettingsHelper;
 
 /* Class to prompt for conversion of userdata to file based encryption
@@ -45,6 +47,14 @@
     }
 
     @Override
+    public void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (InstrumentedPreferenceFragment.usePreferenceScreenTitle()) {
+            getActivity().setTitle(R.string.convert_to_file_encryption);
+        }
+    }
+
+    @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
                 Bundle savedInstanceState) {
         View rootView = inflater.inflate(R.layout.convert_fbe, null);
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index ccd91fd..1df3aef 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -930,11 +930,11 @@
         }
     }
 
-    private void startAppInfoFragment(Class<?> fragment, CharSequence title) {
+    private void startAppInfoFragment(Class<?> fragment, int title) {
         startAppInfoFragment(fragment, title, this, mAppEntry);
     }
 
-    public static void startAppInfoFragment(Class<?> fragment, CharSequence title,
+    public static void startAppInfoFragment(Class<?> fragment, int title,
             SettingsPreferenceFragment caller, AppEntry appEntry) {
         // start new fragment to display extended information
         Bundle args = new Bundle();
@@ -942,7 +942,7 @@
         args.putInt(ARG_PACKAGE_UID, appEntry.info.uid);
 
         SettingsActivity sa = (SettingsActivity) caller.getActivity();
-        sa.startPreferencePanel(caller, fragment.getName(), args, -1, title, caller,
+        sa.startPreferencePanel(caller, fragment.getName(), args, title, null, caller,
                 SUB_INFO_FRAGMENT);
     }
 
@@ -1018,19 +1018,18 @@
     @Override
     public boolean onPreferenceClick(Preference preference) {
         if (preference == mStoragePreference) {
-            startAppInfoFragment(AppStorageSettings.class, mStoragePreference.getTitle());
+            startAppInfoFragment(AppStorageSettings.class, R.string.storage_settings);
         } else if (preference == mNotificationPreference) {
-            startAppInfoFragment(AppNotificationSettings.class,
-                    getString(R.string.app_notifications_title));
+            startAppInfoFragment(AppNotificationSettings.class, R.string.app_notifications_title);
         } else if (preference == mPermissionsPreference) {
             startManagePermissionsActivity();
         } else if (preference == mLaunchPreference) {
-            startAppInfoFragment(AppLaunchSettings.class, mLaunchPreference.getTitle());
+            startAppInfoFragment(AppLaunchSettings.class, R.string.launch_by_default);
         } else if (preference == mMemoryPreference) {
             ProcessStatsBase.launchMemoryDetail((SettingsActivity) getActivity(),
                     mStatsManager.getMemInfo(), mStats, false);
         } else if (preference == mDataPreference) {
-            startAppInfoFragment(AppDataUsage.class, getString(R.string.app_data_usage));
+            startAppInfoFragment(AppDataUsage.class, R.string.app_data_usage);
         } else if (preference == mBatteryPreference) {
             if (isBatteryStatsAvailable()) {
                 BatteryEntry entry = new BatteryEntry(getContext(), null, mUserManager, mSipper);
@@ -1109,8 +1108,7 @@
                 pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                     @Override
                     public boolean onPreferenceClick(Preference preference) {
-                        startAppInfoFragment(DrawOverlayDetails.class,
-                                getString(R.string.draw_overlay));
+                        startAppInfoFragment(DrawOverlayDetails.class, R.string.draw_overlay);
                         return true;
                     }
                 });
@@ -1123,8 +1121,7 @@
                 pref.setOnPreferenceClickListener(new OnPreferenceClickListener() {
                     @Override
                     public boolean onPreferenceClick(Preference preference) {
-                        startAppInfoFragment(WriteSettingsDetails.class,
-                                getString(R.string.write_settings));
+                        startAppInfoFragment(WriteSettingsDetails.class, R.string.write_settings);
                         return true;
                     }
                 });
@@ -1154,7 +1151,7 @@
                     @Override
                     public boolean onPreferenceClick(Preference preference) {
                         startAppInfoFragment(ExternalSourcesDetails.class,
-                                getString(R.string.install_other_apps));
+                                R.string.install_other_apps);
                         return true;
                     }
                 });
diff --git a/src/com/android/settings/applications/ManageDomainUrls.java b/src/com/android/settings/applications/ManageDomainUrls.java
index b9e251c..ce919e1 100644
--- a/src/com/android/settings/applications/ManageDomainUrls.java
+++ b/src/com/android/settings/applications/ManageDomainUrls.java
@@ -63,7 +63,11 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setAnimationAllowed(true);
-        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        if (usePreferenceScreenTitle()) {
+            addPreferencesFromResource(R.xml.manage_domain_url_settings);
+        } else {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        }
         mApplicationsState = ApplicationsState.getInstance(
                 (Application) getContext().getApplicationContext());
         mSession = mApplicationsState.newSession(this, getLifecycle());
diff --git a/src/com/android/settings/applications/PictureInPictureSettings.java b/src/com/android/settings/applications/PictureInPictureSettings.java
index 5569a4e..9b8a897 100644
--- a/src/com/android/settings/applications/PictureInPictureSettings.java
+++ b/src/com/android/settings/applications/PictureInPictureSettings.java
@@ -147,7 +147,9 @@
         mPackageManager = new PackageManagerWrapper(mContext.getPackageManager());
         mUserManager = new UserManagerWrapper(mContext.getSystemService(UserManager.class));
         mIconDrawableFactory = IconDrawableFactory.newInstance(mContext);
-        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
+        if (!usePreferenceScreenTitle()) {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
+        }
     }
 
     @Override
@@ -199,6 +201,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.picture_in_picture_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsEvent.SETTINGS_MANAGE_PICTURE_IN_PICTURE;
     }
diff --git a/src/com/android/settings/applications/PremiumSmsAccess.java b/src/com/android/settings/applications/PremiumSmsAccess.java
index 70bc17c..94945a9 100644
--- a/src/com/android/settings/applications/PremiumSmsAccess.java
+++ b/src/com/android/settings/applications/PremiumSmsAccess.java
@@ -81,6 +81,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.premium_sms_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.PREMIUM_SMS_ACCESS;
     }
@@ -119,8 +124,14 @@
         if (apps == null) return;
         setEmptyText(R.string.premium_sms_none);
         setLoading(false, true);
-        final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(
-                getPrefContext());
+        final PreferenceScreen screen;
+        if (usePreferenceScreenTitle()) {
+            screen = getPreferenceScreen();
+            screen.removeAll();
+        } else {
+            screen = getPreferenceManager().createPreferenceScreen(getPrefContext());
+        }
+
         screen.setOrderingAsAdded(true);
 
         for (int i = 0; i < apps.size(); i++) {
@@ -137,7 +148,9 @@
             screen.addPreference(summary);
         }
 
-        setPreferenceScreen(screen);
+        if (!usePreferenceScreenTitle()) {
+            setPreferenceScreen(screen);
+        }
     }
 
     private void update() {
diff --git a/src/com/android/settings/applications/RunningServices.java b/src/com/android/settings/applications/RunningServices.java
index 634fefd..c79b704 100644
--- a/src/com/android/settings/applications/RunningServices.java
+++ b/src/com/android/settings/applications/RunningServices.java
@@ -15,6 +15,7 @@
  */
 package com.android.settings.applications;
 
+import android.annotation.StringRes;
 import android.os.Bundle;
 import android.view.LayoutInflater;
 import android.view.Menu;
@@ -109,6 +110,12 @@
     }
 
     @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.runningservices_settings_title;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsEvent.RUNNING_SERVICES;
     }
diff --git a/src/com/android/settings/applications/VrListenerSettings.java b/src/com/android/settings/applications/VrListenerSettings.java
index 99340b1..e40e3f9 100644
--- a/src/com/android/settings/applications/VrListenerSettings.java
+++ b/src/com/android/settings/applications/VrListenerSettings.java
@@ -58,6 +58,11 @@
         return super.setEnabled(service, title, enable);
     }
 
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.vr_listeners_settings;
+    }
+
     @VisibleForTesting
     void logSpecialPermissionChange(boolean enable, String packageName) {
         int logCategory = enable ? MetricsEvent.APP_SPECIAL_PERMISSION_VRHELPER_ALLOW
diff --git a/src/com/android/settings/applications/assist/DefaultAssistPicker.java b/src/com/android/settings/applications/assist/DefaultAssistPicker.java
index 07bc809..01ca25a 100644
--- a/src/com/android/settings/applications/assist/DefaultAssistPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultAssistPicker.java
@@ -65,6 +65,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_assist_settings;
+    }
+
+    @Override
     protected List<DefaultAppInfo> getCandidates() {
         mAvailableAssistants.clear();
         addAssistServices();
diff --git a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
index 5adda23..7a5c13d 100644
--- a/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
+++ b/src/com/android/settings/applications/assist/DefaultVoiceInputPicker.java
@@ -24,6 +24,7 @@
 
 import com.android.internal.app.AssistUtils;
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
 import com.android.settings.applications.defaultapps.DefaultAppInfo;
 import com.android.settings.applications.defaultapps.DefaultAppPickerFragment;
 import com.android.settingslib.wrapper.PackageManagerWrapper;
@@ -55,6 +56,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_voice_settings;
+    }
+
+    @Override
     protected List<VoiceInputDefaultAppInfo> getCandidates() {
         final List<VoiceInputDefaultAppInfo> candidates = new ArrayList<>();
         final Context context = getContext();
diff --git a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
index cc85f77..00dedf9 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultAutofillPicker.java
@@ -18,9 +18,7 @@
 
 import android.Manifest;
 import android.app.Activity;
-import android.app.Dialog;
 import android.content.ComponentName;
-import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
@@ -30,7 +28,6 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
-import android.os.Looper;
 import android.provider.Settings;
 import android.service.autofill.AutofillService;
 import android.service.autofill.AutofillServiceInfo;
@@ -106,6 +103,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_autofill_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.DEFAULT_AUTOFILL_PICKER;
     }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
index fb9c3bf..2639c8d 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultBrowserPicker.java
@@ -21,6 +21,7 @@
 import android.content.pm.ResolveInfo;
 
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -31,6 +32,11 @@
 public class DefaultBrowserPicker extends DefaultAppPickerFragment {
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_browser_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.DEFAULT_BROWSER_PICKER;
     }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
index 8f8c64e..bafd56f 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultEmergencyPicker.java
@@ -40,6 +40,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_emergency_settings;
+    }
+
+    @Override
     protected List<DefaultAppInfo> getCandidates() {
         final List<DefaultAppInfo> candidates = new ArrayList<>();
         final List<ResolveInfo> infos = mPm.getPackageManager().queryIntentActivities(
diff --git a/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java b/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
index 75f5292..63efc44 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultHomePicker.java
@@ -44,6 +44,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_home_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.DEFAULT_HOME_PICKER;
     }
diff --git a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
index 9f6cc4d..6a1d919 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultPhonePicker.java
@@ -23,6 +23,7 @@
 import android.text.TextUtils;
 
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -44,6 +45,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_phone_settings;
+    }
+
+    @Override
     protected List<DefaultAppInfo> getCandidates() {
         final List<DefaultAppInfo> candidates = new ArrayList<>();
         final List<String> dialerPackages =
diff --git a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
index 57159b3..4c6c9ce 100644
--- a/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
+++ b/src/com/android/settings/applications/defaultapps/DefaultSmsPicker.java
@@ -40,6 +40,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.default_sms_settings;
+    }
+
+    @Override
     protected List<DefaultAppInfo> getCandidates() {
         final Context context = getContext();
         final Collection<SmsApplication.SmsApplicationData> smsApplications =
diff --git a/src/com/android/settings/applications/manageapplications/ManageApplications.java b/src/com/android/settings/applications/manageapplications/ManageApplications.java
index 3caa8ab..33762e4 100644
--- a/src/com/android/settings/applications/manageapplications/ManageApplications.java
+++ b/src/com/android/settings/applications/manageapplications/ManageApplications.java
@@ -223,10 +223,13 @@
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setHasOptionsMenu(true);
-        mApplicationsState = ApplicationsState.getInstance(getActivity().getApplication());
+        final Activity activity = getActivity();
+        mApplicationsState = ApplicationsState.getInstance(activity.getApplication());
 
-        Intent intent = getActivity().getIntent();
+        Intent intent = activity.getIntent();
         Bundle args = getArguments();
+        int screenTitle = intent.getIntExtra(
+                SettingsActivity.EXTRA_SHOW_FRAGMENT_TITLE_RESID, R.string.notifications_label);
         String className = args != null ? args.getString(EXTRA_CLASSNAME) : null;
         if (className == null) {
             className = intent.getComponent().getClassName();
@@ -235,6 +238,7 @@
                 || this instanceof NotificationApps) {
             mListType = LIST_TYPE_NOTIFICATION;
             mNotifBackend = new NotificationBackend();
+            screenTitle = R.string.app_notifications_title;
         } else if (className.equals(StorageUseActivity.class.getName())) {
             if (args != null && args.containsKey(EXTRA_VOLUME_UUID)) {
                 mVolumeUuid = args.getString(EXTRA_VOLUME_UUID);
@@ -247,16 +251,21 @@
             mSortOrder = R.id.sort_order_size;
         } else if (className.equals(UsageAccessSettingsActivity.class.getName())) {
             mListType = LIST_TYPE_USAGE_ACCESS;
+            screenTitle = R.string.usage_access;
         } else if (className.equals(HighPowerApplicationsActivity.class.getName())) {
             mListType = LIST_TYPE_HIGH_POWER;
             // Default to showing system.
             mShowSystem = true;
+            screenTitle = R.string.high_power_apps;
         } else if (className.equals(OverlaySettingsActivity.class.getName())) {
             mListType = LIST_TYPE_OVERLAY;
+            screenTitle = R.string.system_alert_window_settings;
         } else if (className.equals(WriteSettingsActivity.class.getName())) {
             mListType = LIST_TYPE_WRITE_SETTINGS;
+            screenTitle = R.string.write_settings;
         } else if (className.equals(ManageExternalSourcesActivity.class.getName())) {
             mListType = LIST_TYPE_MANAGE_SOURCES;
+            screenTitle = R.string.install_other_apps;
         } else if (className.equals(GamesStorageActivity.class.getName())) {
             mListType = LIST_TYPE_GAMES;
             mSortOrder = R.id.sort_order_size;
@@ -280,9 +289,13 @@
             mShowSystem = savedInstanceState.getBoolean(EXTRA_SHOW_SYSTEM, mShowSystem);
         }
 
-        mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
+        mInvalidSizeStr = activity.getText(R.string.invalid_size_value);
 
-        mResetAppsHelper = new ResetAppsHelper(getActivity());
+        mResetAppsHelper = new ResetAppsHelper(activity);
+
+        if (usePreferenceScreenTitle() && screenTitle > 0) {
+            activity.setTitle(screenTitle);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/datausage/DataUsagePreference.java b/src/com/android/settings/datausage/DataUsagePreference.java
index 63f6054..35cfbbc 100644
--- a/src/com/android/settings/datausage/DataUsagePreference.java
+++ b/src/com/android/settings/datausage/DataUsagePreference.java
@@ -16,23 +16,36 @@
 
 import android.content.Context;
 import android.content.Intent;
+import android.content.res.TypedArray;
 import android.net.NetworkTemplate;
 import android.os.Bundle;
+import android.support.v4.content.res.TypedArrayUtils;
 import android.support.v7.preference.Preference;
 import android.text.format.Formatter;
 import android.util.AttributeSet;
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
 import com.android.settings.Utils;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settingslib.net.DataUsageController;
 
 public class DataUsagePreference extends Preference implements TemplatePreference {
 
     private NetworkTemplate mTemplate;
     private int mSubId;
+    private int mTitleRes;
 
     public DataUsagePreference(Context context, AttributeSet attrs) {
         super(context, attrs);
+        if (InstrumentedPreferenceFragment.usePreferenceScreenTitle()) {
+            final TypedArray a = context.obtainStyledAttributes(
+                    attrs, new int[] { com.android.internal.R.attr.title },
+                    TypedArrayUtils.getAttr(
+                            context, android.support.v7.preference.R.attr.preferenceStyle,
+                            android.R.attr.preferenceStyle), 0);
+            mTitleRes = a.getResourceId(0, 0);
+            a.recycle();
+        }
     }
 
     @Override
@@ -52,6 +65,11 @@
         Bundle args = new Bundle();
         args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
         args.putInt(DataUsageList.EXTRA_SUB_ID, mSubId);
+        if (mTitleRes > 0) {
+            return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(),
+                    args, getContext().getPackageName(), mTitleRes, null, false,
+                    MetricsProto.MetricsEvent.VIEW_UNKNOWN);
+        }
         return Utils.onBuildStartFragmentIntent(getContext(), DataUsageList.class.getName(), args,
                 getContext().getPackageName(), 0, getTitle(), false,
                 MetricsProto.MetricsEvent.VIEW_UNKNOWN);
diff --git a/src/com/android/settings/datausage/UnrestrictedDataAccess.java b/src/com/android/settings/datausage/UnrestrictedDataAccess.java
index c60b841..8fad986 100644
--- a/src/com/android/settings/datausage/UnrestrictedDataAccess.java
+++ b/src/com/android/settings/datausage/UnrestrictedDataAccess.java
@@ -59,7 +59,11 @@
     public void onCreate(Bundle icicle) {
         super.onCreate(icicle);
         setAnimationAllowed(true);
-        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        if (usePreferenceScreenTitle()) {
+            addPreferencesFromResource(R.xml.unrestricted_data_access_settings);
+        } else {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(getContext()));
+        }
         mApplicationsState = ApplicationsState.getInstance(
                 (Application) getContext().getApplicationContext());
         mDataSaverBackend = new DataSaverBackend(getContext());
@@ -267,7 +271,7 @@
             if (mState.isDataSaverBlacklisted) {
                 // app is blacklisted, launch App Data Usage screen
                 InstalledAppDetails.startAppInfoFragment(AppDataUsage.class,
-                        getContext().getString(R.string.app_data_usage),
+                        R.string.app_data_usage,
                         UnrestrictedDataAccess.this,
                         mEntry);
             } else {
diff --git a/src/com/android/settings/datetime/ZonePicker.java b/src/com/android/settings/datetime/ZonePicker.java
index 2d58dd8..00a77df 100644
--- a/src/com/android/settings/datetime/ZonePicker.java
+++ b/src/com/android/settings/datetime/ZonePicker.java
@@ -34,6 +34,7 @@
 
 import com.android.internal.logging.nano.MetricsProto;
 import com.android.settings.R;
+import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.core.instrumentation.Instrumentable;
 import com.android.settings.core.instrumentation.VisibilityLoggerMixin;
 import com.android.settingslib.datetime.ZoneGetter;
@@ -164,6 +165,9 @@
         // Sets the adapter
         setSorting(true);
         setHasOptionsMenu(true);
+        if (InstrumentedPreferenceFragment.usePreferenceScreenTitle()) {
+            activity.setTitle(R.string.date_time_set_timezone);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java b/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java
index 998e431..c482d87 100644
--- a/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java
+++ b/src/com/android/settings/development/featureflags/FeatureFlagsDashboard.java
@@ -42,7 +42,7 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.placeholder_prefs;
+        return R.xml.feature_flags_settings;
     }
 
     @Override
diff --git a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java
index c822de0..ca4181e 100644
--- a/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java
+++ b/src/com/android/settings/development/qstile/DevelopmentTileConfigFragment.java
@@ -29,7 +29,6 @@
 public class DevelopmentTileConfigFragment extends DashboardFragment {
     private static final String TAG = "DevelopmentTileConfig";
 
-
     @Override
     protected String getLogTag() {
         return TAG;
@@ -37,7 +36,7 @@
 
     @Override
     protected int getPreferenceScreenResId() {
-        return R.xml.placeholder_prefs;
+        return R.xml.development_tile_settings;
     }
 
     @Override
diff --git a/src/com/android/settings/display/ScreenZoomSettings.java b/src/com/android/settings/display/ScreenZoomSettings.java
index ec3999b..ab92155 100644
--- a/src/com/android/settings/display/ScreenZoomSettings.java
+++ b/src/com/android/settings/display/ScreenZoomSettings.java
@@ -17,6 +17,7 @@
 package com.android.settings.display;
 
 import android.annotation.Nullable;
+import android.annotation.StringRes;
 import android.content.Context;
 import android.content.res.Configuration;
 import android.content.res.Resources;
@@ -99,6 +100,12 @@
     }
 
     @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.screen_zoom_title;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsEvent.DISPLAY_SCREEN_ZOOM;
     }
diff --git a/src/com/android/settings/display/VrDisplayPreferencePicker.java b/src/com/android/settings/display/VrDisplayPreferencePicker.java
index bccdaa5..5487c46 100644
--- a/src/com/android/settings/display/VrDisplayPreferencePicker.java
+++ b/src/com/android/settings/display/VrDisplayPreferencePicker.java
@@ -33,6 +33,11 @@
     static final String PREF_KEY_PREFIX = "vr_display_pref_";
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.vr_display_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.VR_DISPLAY_PREFERENCE;
     }
diff --git a/src/com/android/settings/dream/CurrentDreamPicker.java b/src/com/android/settings/dream/CurrentDreamPicker.java
index da9bf9e..f0d520c 100644
--- a/src/com/android/settings/dream/CurrentDreamPicker.java
+++ b/src/com/android/settings/dream/CurrentDreamPicker.java
@@ -16,11 +16,11 @@
 
 package com.android.settings.dream;
 
-
 import android.content.ComponentName;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
 import com.android.internal.logging.nano.MetricsProto;
+import com.android.settings.R;
 import com.android.settings.widget.RadioButtonPickerFragment;
 import com.android.settingslib.dream.DreamBackend;
 import com.android.settingslib.dream.DreamBackend.DreamInfo;
@@ -41,6 +41,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.current_dream_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.DREAM;
     }
diff --git a/src/com/android/settings/dream/WhenToDreamPicker.java b/src/com/android/settings/dream/WhenToDreamPicker.java
index a55064d..7031bdf 100644
--- a/src/com/android/settings/dream/WhenToDreamPicker.java
+++ b/src/com/android/settings/dream/WhenToDreamPicker.java
@@ -38,6 +38,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.when_to_dream_settings;
+    }
+
+    @Override
     public int getMetricsCategory() {
         return MetricsProto.MetricsEvent.DREAM;
     }
diff --git a/src/com/android/settings/nfc/AndroidBeam.java b/src/com/android/settings/nfc/AndroidBeam.java
index fe264f3..e40fc21 100644
--- a/src/com/android/settings/nfc/AndroidBeam.java
+++ b/src/com/android/settings/nfc/AndroidBeam.java
@@ -16,6 +16,7 @@
 
 package com.android.settings.nfc;
 
+import android.annotation.StringRes;
 import android.nfc.NfcAdapter;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -130,4 +131,10 @@
     public int getMetricsCategory() {
         return MetricsEvent.NFC_BEAM;
     }
+
+    @Override
+    @StringRes
+    protected int getTitle() {
+        return R.string.android_beam_settings_title;
+    }
 }
diff --git a/src/com/android/settings/nfc/PaymentSettings.java b/src/com/android/settings/nfc/PaymentSettings.java
index 10f1154..66d1103 100644
--- a/src/com/android/settings/nfc/PaymentSettings.java
+++ b/src/com/android/settings/nfc/PaymentSettings.java
@@ -58,8 +58,14 @@
         mPaymentBackend = new PaymentBackend(getActivity());
         setHasOptionsMenu(true);
 
-        PreferenceManager manager = getPreferenceManager();
-        PreferenceScreen screen = manager.createPreferenceScreen(getActivity());
+        final PreferenceScreen screen;
+        if (usePreferenceScreenTitle()) {
+            addPreferencesFromResource(R.xml.nfc_payment_settings);
+            screen = getPreferenceScreen();
+        } else {
+            PreferenceManager manager = getPreferenceManager();
+            screen = manager.createPreferenceScreen(getActivity());
+        }
 
         List<PaymentBackend.PaymentAppInfo> appInfos = mPaymentBackend.getPaymentAppInfos();
         if (appInfos != null && appInfos.size() > 0) {
@@ -71,7 +77,9 @@
                     mPaymentBackend);
             screen.addPreference(foreground);
         }
-        setPreferenceScreen(screen);
+        if (!usePreferenceScreenTitle()) {
+            setPreferenceScreen(screen);
+        }
     }
 
     @Override
diff --git a/src/com/android/settings/notification/EmptyTextSettings.java b/src/com/android/settings/notification/EmptyTextSettings.java
index 3f8ccc6..2b5998e 100644
--- a/src/com/android/settings/notification/EmptyTextSettings.java
+++ b/src/com/android/settings/notification/EmptyTextSettings.java
@@ -32,6 +32,17 @@
     private TextView mEmpty;
 
     @Override
+    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
+        super.onCreatePreferences(savedInstanceState, rootKey);
+        if (usePreferenceScreenTitle()) {
+            final int resId = getPreferenceScreenResId();
+            if (resId > 0) {
+                addPreferencesFromResource(resId);
+            }
+        }
+    }
+
+    @Override
     public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
         super.onViewCreated(view, savedInstanceState);
         mEmpty = new TextView(getContext());
@@ -47,4 +58,9 @@
     protected void setEmptyText(int text) {
         mEmpty.setText(text);
     }
+
+    /**
+     * Get the res id for static preference xml for this fragment.
+     */
+    protected abstract int getPreferenceScreenResId();
 }
diff --git a/src/com/android/settings/notification/NotificationAccessSettings.java b/src/com/android/settings/notification/NotificationAccessSettings.java
index 858482c..af89f49 100644
--- a/src/com/android/settings/notification/NotificationAccessSettings.java
+++ b/src/com/android/settings/notification/NotificationAccessSettings.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.notification;
 
-import android.app.ActivityManager;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.Fragment;
@@ -38,11 +37,6 @@
     private static final String TAG = NotificationAccessSettings.class.getSimpleName();
     private static final Config CONFIG = getNotificationListenerConfig();
 
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-    }
-
     private static Config getNotificationListenerConfig() {
         final Config c = new Config();
         c.tag = TAG;
@@ -100,6 +94,11 @@
         mNm.setNotificationListenerAccessGranted(service, true);
     }
 
+    @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.notification_access_settings;
+    }
+
     @VisibleForTesting
     void logSpecialPermissionChange(boolean enable, String packageName) {
         int logCategory = enable ? MetricsEvent.APP_SPECIAL_PERMISSION_NOTIVIEW_ALLOW
diff --git a/src/com/android/settings/notification/ZenAccessSettings.java b/src/com/android/settings/notification/ZenAccessSettings.java
index 238c11e..44052b1 100644
--- a/src/com/android/settings/notification/ZenAccessSettings.java
+++ b/src/com/android/settings/notification/ZenAccessSettings.java
@@ -21,9 +21,7 @@
 import android.app.AlertDialog;
 import android.app.AppGlobals;
 import android.app.Dialog;
-import android.app.DialogFragment;
 import android.app.NotificationManager;
-import android.content.ComponentName;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.pm.ApplicationInfo;
@@ -38,7 +36,6 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.RemoteException;
-import android.provider.Settings;
 import android.provider.Settings.Secure;
 import android.support.v14.preference.SwitchPreference;
 import android.support.v7.preference.Preference;
@@ -48,7 +45,6 @@
 import android.util.ArraySet;
 import android.util.Log;
 import android.view.View;
-import android.widget.Toast;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
@@ -80,7 +76,9 @@
         mContext = getActivity();
         mPkgMan = mContext.getPackageManager();
         mNoMan = mContext.getSystemService(NotificationManager.class);
-        setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
+        if (!usePreferenceScreenTitle()) {
+            setPreferenceScreen(getPreferenceManager().createPreferenceScreen(mContext));
+        }
     }
 
     @Override
@@ -90,6 +88,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.zen_access_settings;
+    }
+
+    @Override
     public void onResume() {
         super.onResume();
         if (!ActivityManager.isLowRamDeviceStatic()) {
diff --git a/src/com/android/settings/webview/WebViewAppPicker.java b/src/com/android/settings/webview/WebViewAppPicker.java
index 536cd8b..0e9fc39 100644
--- a/src/com/android/settings/webview/WebViewAppPicker.java
+++ b/src/com/android/settings/webview/WebViewAppPicker.java
@@ -58,6 +58,11 @@
     }
 
     @Override
+    protected int getPreferenceScreenResId() {
+        return R.xml.webview_app_settings;
+    }
+
+    @Override
     protected List<DefaultAppInfo> getCandidates() {
         final List<DefaultAppInfo> packageInfoList = new ArrayList<DefaultAppInfo>();
         final Context context = getContext();
diff --git a/src/com/android/settings/widget/RadioButtonPickerFragment.java b/src/com/android/settings/widget/RadioButtonPickerFragment.java
index d736319..f1df0a5 100644
--- a/src/com/android/settings/widget/RadioButtonPickerFragment.java
+++ b/src/com/android/settings/widget/RadioButtonPickerFragment.java
@@ -17,9 +17,6 @@
 package com.android.settings.widget;
 
 import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.UserHandle;
@@ -70,7 +67,12 @@
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
         super.onCreatePreferences(savedInstanceState, rootKey);
-        addPreferencesFromResource(R.xml.placeholder_prefs);
+        final int resId = getPreferenceScreenResId();
+        if (usePreferenceScreenTitle() && resId > 0) {
+            addPreferencesFromResource(resId);
+        } else {
+            addPreferencesFromResource(R.xml.placeholder_prefs);
+        }
         updateCandidates();
     }
 
@@ -114,6 +116,13 @@
     }
 
     /**
+     * Get the res id for static preference xml for this fragment.
+     */
+    protected int getPreferenceScreenResId() {
+        return -1;
+    }
+
+    /**
      * A chance for subclasses to bind additional things to the preference.
      */
     @VisibleForTesting(otherwise = VisibleForTesting.PROTECTED)
