diff --git a/src/com/android/settings/AppPicker.java b/src/com/android/settings/AppPicker.java
index 2447bcb..04e48ff 100644
--- a/src/com/android/settings/AppPicker.java
+++ b/src/com/android/settings/AppPicker.java
@@ -164,7 +164,6 @@
                 holder.summary.setText("");
             }
             holder.disabled.setVisibility(View.GONE);
-            holder.checkBox.setVisibility(View.GONE);
             return convertView;
         }
     }
diff --git a/src/com/android/settings/AppProgressPreference.java b/src/com/android/settings/AppProgressPreference.java
new file mode 100644
index 0000000..cd157d1
--- /dev/null
+++ b/src/com/android/settings/AppProgressPreference.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2015 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.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ProgressBar;
+
+public class AppProgressPreference extends TintablePreference {
+
+    private int mProgress;
+
+    public AppProgressPreference(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setLayoutResource(R.layout.preference_app);
+        setWidgetLayoutResource(R.layout.widget_progress_bar);
+    }
+
+    public void setProgress(int amount) {
+        mProgress = amount;
+        notifyChanged();
+    }
+
+    @Override
+    protected void onBindView(View view) {
+        super.onBindView(view);
+
+        final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
+        progress.setProgress(mProgress);
+    }
+}
diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 744ed3f..a4ee9616 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -1882,10 +1882,10 @@
         @Override
         public View getView(int position, View convertView, ViewGroup parent) {
             final AppItem item = mItems.get(position);
+            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
             if (getItemViewType(position) == 1) {
                 if (convertView == null) {
-                    convertView = Utils.inflateCategoryHeader(LayoutInflater.from(
-                            parent.getContext()), parent);
+                    convertView = Utils.inflateCategoryHeader(inflater, parent);
                 }
 
                 final TextView title = (TextView) convertView.findViewById(android.R.id.title);
@@ -1893,8 +1893,9 @@
 
             } else {
                 if (convertView == null) {
-                    convertView = LayoutInflater.from(parent.getContext()).inflate(
-                            R.layout.data_usage_item, parent, false);
+                    convertView = inflater.inflate(R.layout.data_usage_item, parent, false);
+                    inflater.inflate(R.layout.widget_progress_bar,
+                            (ViewGroup) convertView.findViewById(android.R.id.widget_frame));
 
                     if (mInsetSide > 0) {
                         convertView.setPaddingRelative(mInsetSide, 0, mInsetSide, 0);
@@ -1903,7 +1904,7 @@
 
                 final Context context = parent.getContext();
 
-                final TextView text1 = (TextView) convertView.findViewById(android.R.id.text1);
+                final TextView summary = (TextView) convertView.findViewById(android.R.id.summary);
                 final ProgressBar progress = (ProgressBar) convertView.findViewById(
                         android.R.id.progress);
 
@@ -1911,10 +1912,10 @@
                 UidDetailTask.bindView(mProvider, item, convertView);
 
                 if (item.restricted && item.total <= 0) {
-                    text1.setText(R.string.data_usage_app_restricted);
+                    summary.setText(R.string.data_usage_app_restricted);
                     progress.setVisibility(View.GONE);
                 } else {
-                    text1.setText(Formatter.formatFileSize(context, item.total));
+                    summary.setText(Formatter.formatFileSize(context, item.total));
                     progress.setVisibility(View.VISIBLE);
                 }
 
diff --git a/src/com/android/settings/SettingsActivity.java b/src/com/android/settings/SettingsActivity.java
index f376644..226ea0e 100644
--- a/src/com/android/settings/SettingsActivity.java
+++ b/src/com/android/settings/SettingsActivity.java
@@ -73,6 +73,7 @@
 import com.android.settings.applications.InstalledAppDetails;
 import com.android.settings.applications.ManageApplications;
 import com.android.settings.applications.ManageAssist;
+import com.android.settings.applications.ProcessStatsSummary;
 import com.android.settings.applications.ProcessStatsUi;
 import com.android.settings.applications.UsageAccessDetails;
 import com.android.settings.bluetooth.BluetoothSettings;
@@ -346,6 +347,7 @@
             ZenModeExternalRuleSettings.class.getName(),
             ProcessStatsUi.class.getName(),
             PowerUsageDetail.class.getName(),
+            ProcessStatsSummary.class.getName(),
     };
 
 
diff --git a/src/com/android/settings/applications/AppOpsDetails.java b/src/com/android/settings/applications/AppOpsDetails.java
index 0643b56..a8320b1 100644
--- a/src/com/android/settings/applications/AppOpsDetails.java
+++ b/src/com/android/settings/applications/AppOpsDetails.java
@@ -27,6 +27,7 @@
 import android.content.pm.PermissionGroupInfo;
 import android.content.pm.PermissionInfo;
 import android.content.res.Resources;
+import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.util.Log;
 import android.view.LayoutInflater;
@@ -57,29 +58,15 @@
     private PackageInfo mPackageInfo;
     private LayoutInflater mInflater;
     private View mRootView;
-    private TextView mAppVersion;
     private LinearLayout mOperationsSection;
 
     // Utility method to set application label and icon.
     private void setAppLabelAndIcon(PackageInfo pkgInfo) {
         final View appSnippet = mRootView.findViewById(R.id.app_snippet);
-        appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0, appSnippet.getPaddingBottom());
-
-        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
-        icon.setImageDrawable(mPm.getApplicationIcon(pkgInfo.applicationInfo));
-        // Set application name.
-        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
-        label.setText(mPm.getApplicationLabel(pkgInfo.applicationInfo));
-        // Version number of application
-        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_summary);
-
-        if (pkgInfo.versionName != null) {
-            mAppVersion.setVisibility(View.VISIBLE);
-            mAppVersion.setText(getActivity().getString(R.string.version_text,
-                    String.valueOf(pkgInfo.versionName)));
-        } else {
-            mAppVersion.setVisibility(View.INVISIBLE);
-        }
+        CharSequence label = mPm.getApplicationLabel(pkgInfo.applicationInfo);
+        Drawable icon = mPm.getApplicationIcon(pkgInfo.applicationInfo);
+        InstalledAppDetails.setupAppSnippet(appSnippet, label, icon,
+                pkgInfo != null ? pkgInfo.versionName : null);
     }
 
     private String retrieveAppEntry() {
diff --git a/src/com/android/settings/applications/AppViewHolder.java b/src/com/android/settings/applications/AppViewHolder.java
index f58cf06..9771427 100644
--- a/src/com/android/settings/applications/AppViewHolder.java
+++ b/src/com/android/settings/applications/AppViewHolder.java
@@ -19,6 +19,7 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.CheckBox;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -34,21 +35,21 @@
     public ImageView appIcon;
     public TextView summary;
     public TextView disabled;
-    public CheckBox checkBox;
 
     static public AppViewHolder createOrRecycle(LayoutInflater inflater, View convertView) {
         if (convertView == null) {
-            convertView = inflater.inflate(R.layout.manage_applications_item, null);
+            convertView = inflater.inflate(R.layout.preference_app, null);
+            inflater.inflate(R.layout.widget_text_views,
+                    (ViewGroup) convertView.findViewById(android.R.id.widget_frame));
 
             // Creates a ViewHolder and store references to the two children views
             // we want to bind data to.
             AppViewHolder holder = new AppViewHolder();
             holder.rootView = convertView;
-            holder.appName = (TextView) convertView.findViewById(R.id.app_name);
-            holder.appIcon = (ImageView) convertView.findViewById(R.id.app_icon);
-            holder.summary = (TextView) convertView.findViewById(R.id.app_summary);
-            holder.disabled = (TextView) convertView.findViewById(R.id.app_disabled);
-            holder.checkBox = (CheckBox) convertView.findViewById(R.id.app_on_sdcard);
+            holder.appName = (TextView) convertView.findViewById(android.R.id.title);
+            holder.appIcon = (ImageView) convertView.findViewById(android.R.id.icon);
+            holder.summary = (TextView) convertView.findViewById(R.id.widget_text1);
+            holder.disabled = (TextView) convertView.findViewById(R.id.widget_text2);
             convertView.setTag(holder);
             return holder;
         } else {
diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 9649d27..b344644 100755
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -36,6 +36,7 @@
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
 import android.icu.text.ListFormatter;
+import android.graphics.drawable.Drawable;
 import android.net.INetworkStatsService;
 import android.net.INetworkStatsSession;
 import android.net.NetworkTemplate;
@@ -49,13 +50,16 @@
 import android.os.UserHandle;
 import android.preference.Preference;
 import android.preference.Preference.OnPreferenceClickListener;
+import android.text.TextUtils;
 import android.text.format.DateUtils;
 import android.text.format.Formatter;
 import android.util.Log;
+import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
 import android.view.View;
+import android.view.ViewGroup;
 import android.widget.Button;
 import android.widget.ImageView;
 import android.widget.TextView;
@@ -130,7 +134,6 @@
     private LayoutPreference mHeader;
     private Button mUninstallButton;
     private boolean mUpdatedSysApp = false;
-    private TextView mAppVersion;
     private Button mForceStopButton;
     private Preference mNotificationPreference;
     private Preference mStoragePreference;
@@ -424,25 +427,9 @@
     // Utility method to set application label and icon.
     private void setAppLabelAndIcon(PackageInfo pkgInfo) {
         final View appSnippet = mHeader.findViewById(R.id.app_snippet);
-        appSnippet.setPaddingRelative(0, appSnippet.getPaddingTop(), 0,
-                appSnippet.getPaddingBottom());
-
-        ImageView icon = (ImageView) appSnippet.findViewById(R.id.app_icon);
         mState.ensureIcon(mAppEntry);
-        icon.setImageDrawable(mAppEntry.icon);
-        // Set application name.
-        TextView label = (TextView) appSnippet.findViewById(R.id.app_name);
-        label.setText(mAppEntry.label);
-        // Version number of application
-        mAppVersion = (TextView) appSnippet.findViewById(R.id.app_summary);
-
-        if (pkgInfo != null && pkgInfo.versionName != null) {
-            mAppVersion.setVisibility(View.VISIBLE);
-            mAppVersion.setText(getActivity().getString(R.string.version_text,
-                    String.valueOf(pkgInfo.versionName)));
-        } else {
-            mAppVersion.setVisibility(View.INVISIBLE);
-        }
+        setupAppSnippet(appSnippet, mAppEntry.label, mAppEntry.icon,
+                pkgInfo != null ? pkgInfo.versionName : null);
     }
 
     private boolean signaturesMatch(String pkg1, String pkg2) {
@@ -757,6 +744,28 @@
         return true;
     }
 
+    public static void setupAppSnippet(View appSnippet, CharSequence label, Drawable icon,
+            CharSequence versionName) {
+        LayoutInflater.from(appSnippet.getContext()).inflate(R.layout.widget_text_views,
+                (ViewGroup) appSnippet.findViewById(android.R.id.widget_frame));
+
+        ImageView iconView = (ImageView) appSnippet.findViewById(android.R.id.icon);
+        iconView.setImageDrawable(icon);
+        // Set application name.
+        TextView labelView = (TextView) appSnippet.findViewById(android.R.id.title);
+        labelView.setText(label);
+        // Version number of application
+        TextView appVersion = (TextView) appSnippet.findViewById(R.id.widget_text1);
+
+        if (!TextUtils.isEmpty(versionName)) {
+            appVersion.setVisibility(View.VISIBLE);
+            appVersion.setText(appSnippet.getContext().getString(R.string.version_text,
+                    String.valueOf(versionName)));
+        } else {
+            appVersion.setVisibility(View.INVISIBLE);
+        }
+    }
+
     private static NetworkTemplate getTemplate(Context context) {
         if (DataUsageSummary.hasReadyMobileRadio(context)) {
             return NetworkTemplate.buildTemplateMobileWildcard();
diff --git a/src/com/android/settings/applications/LayoutPreference.java b/src/com/android/settings/applications/LayoutPreference.java
index 75387d3..f0c7e4a 100644
--- a/src/com/android/settings/applications/LayoutPreference.java
+++ b/src/com/android/settings/applications/LayoutPreference.java
@@ -58,6 +58,11 @@
         return mRootView;
     }
 
+    @Override
+    protected void onBindView(View view) {
+        // Do nothing.
+    }
+
     public View findViewById(int id) {
         return mRootView.findViewById(id);
     }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 8281885..11f35c8 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -984,7 +984,6 @@
                 } else {
                     holder.disabled.setVisibility(View.GONE);
                 }
-                holder.checkBox.setVisibility(View.GONE);
             }
             mActive.remove(convertView);
             mActive.add(convertView);
diff --git a/src/com/android/settings/applications/ProcessStatsMemDetail.java b/src/com/android/settings/applications/ProcessStatsMemDetail.java
index 7ae2824..6a4f470 100644
--- a/src/com/android/settings/applications/ProcessStatsMemDetail.java
+++ b/src/com/android/settings/applications/ProcessStatsMemDetail.java
@@ -105,8 +105,9 @@
     private void addDetailsItem(ViewGroup parent, CharSequence title,
             float level, CharSequence value) {
         LayoutInflater inflater = getActivity().getLayoutInflater();
-        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.app_percentage_item,
-                null);
+        ViewGroup item = (ViewGroup) inflater.inflate(R.layout.app_item, null);
+        inflater.inflate(R.layout.widget_progress_bar,
+                (ViewGroup) item.findViewById(android.R.id.widget_frame));
         parent.addView(item);
         item.findViewById(android.R.id.icon).setVisibility(View.GONE);
         TextView titleView = (TextView) item.findViewById(android.R.id.title);
diff --git a/src/com/android/settings/applications/ProcessStatsPreference.java b/src/com/android/settings/applications/ProcessStatsPreference.java
index 48c6a9f..996ed15 100644
--- a/src/com/android/settings/applications/ProcessStatsPreference.java
+++ b/src/com/android/settings/applications/ProcessStatsPreference.java
@@ -19,40 +19,17 @@
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.graphics.drawable.ColorDrawable;
-import android.preference.Preference;
 import android.text.TextUtils;
 import android.text.format.Formatter;
-import android.util.AttributeSet;
-import android.view.View;
 
-import com.android.settings.R;
+import com.android.settings.AppProgressPreference;
 
-public class ProcessStatsPreference extends Preference {
+public class ProcessStatsPreference extends AppProgressPreference {
 
     private ProcStatsPackageEntry mEntry;
-    private final int mColor;
-    private final int mRemainingColor;
-    private float mRatio;
-    private float mRemainingRatio;
 
     public ProcessStatsPreference(Context context) {
-        this(context, null);
-    }
-
-    public ProcessStatsPreference(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public ProcessStatsPreference(Context context, AttributeSet attrs, int defStyleAttr) {
-        this(context, attrs, defStyleAttr, 0);
-    }
-
-    public ProcessStatsPreference(Context context, AttributeSet attrs, int defStyleAttr,
-            int defStyleRes) {
-        super(context, attrs, defStyleAttr, defStyleRes);
-        setLayoutResource(R.layout.app_item_linear_color);
-        mColor = context.getColor(R.color.memory_max_use);
-        mRemainingColor = context.getColor(R.color.memory_remaining);
+        super(context, null);
     }
 
     public void init(ProcStatsPackageEntry entry, PackageManager pm, double maxMemory,
@@ -68,20 +45,10 @@
         double amount = avg ? (statsForeground ? entry.mRunWeight : entry.mBgWeight) * weightToRam
                 : (statsForeground ? entry.mMaxRunMem : entry.mMaxBgMem) * totalScale * 1024;
         setSummary(Formatter.formatShortFileSize(getContext(), (long) amount));
-        mRatio = (float) (amount / maxMemory);
-        mRemainingRatio = 1 - mRatio;
+        setProgress((int) (100 * amount / maxMemory));
     }
 
     public ProcStatsPackageEntry getEntry() {
         return mEntry;
     }
-
-    @Override
-    protected void onBindView(View view) {
-        super.onBindView(view);
-
-        LinearColorBar linearColorBar = (LinearColorBar) view.findViewById(R.id.linear_color_bar);
-        linearColorBar.setColors(mColor, mColor, mRemainingColor);
-        linearColorBar.setRatios(mRatio, 0, mRemainingRatio);
-    }
 }
diff --git a/src/com/android/settings/fuelgauge/PowerGaugePreference.java b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
index e80f492..0be73d8 100644
--- a/src/com/android/settings/fuelgauge/PowerGaugePreference.java
+++ b/src/com/android/settings/fuelgauge/PowerGaugePreference.java
@@ -19,38 +19,31 @@
 import android.content.Context;
 import android.graphics.drawable.ColorDrawable;
 import android.graphics.drawable.Drawable;
-import android.preference.Preference;
 import android.view.View;
-import android.widget.ProgressBar;
 import android.widget.TextView;
 
-import com.android.settings.R;
-import com.android.settings.TintablePreference;
+import com.android.settings.AppProgressPreference;
 import com.android.settings.Utils;
 
 /**
  * Custom preference for displaying power consumption as a bar and an icon on
  * the left for the subsystem/app type.
  */
-public class PowerGaugePreference extends TintablePreference {
+public class PowerGaugePreference extends AppProgressPreference {
     private BatteryEntry mInfo;
-    private int mProgress;
-    private CharSequence mProgressText;
     private final CharSequence mContentDescription;
 
     public PowerGaugePreference(Context context, Drawable icon, CharSequence contentDescription,
             BatteryEntry info) {
         super(context, null);
-        setLayoutResource(R.layout.preference_app_percentage);
         setIcon(icon != null ? icon : new ColorDrawable(0));
         mInfo = info;
         mContentDescription = contentDescription;
     }
 
     public void setPercent(double percentOfMax, double percentOfTotal) {
-        mProgress = (int) Math.ceil(percentOfMax);
-        mProgressText = Utils.formatPercentage((int) (percentOfTotal + 0.5));
-        notifyChanged();
+        setProgress((int) Math.ceil(percentOfMax));
+        setSummary(Utils.formatPercentage((int) (percentOfTotal + 0.5)));
     }
 
     BatteryEntry getInfo() {
@@ -61,12 +54,6 @@
     protected void onBindView(View view) {
         super.onBindView(view);
 
-        final ProgressBar progress = (ProgressBar) view.findViewById(android.R.id.progress);
-        progress.setProgress(mProgress);
-
-        final TextView text1 = (TextView) view.findViewById(android.R.id.text1);
-        text1.setText(mProgressText);
-
         if (mContentDescription != null) {
             final TextView titleView = (TextView) view.findViewById(android.R.id.title);
             titleView.setContentDescription(mContentDescription);
