diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 70c0d9b..ae9c1cb 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -1147,8 +1147,15 @@
         final String totalPhrase = Formatter.formatFileSize(context, totalBytes);
         final String rangePhrase = formatDateRange(context, start, end);
 
-        mUsageSummary.setText(
-                getString(R.string.data_usage_total_during_range, totalPhrase, rangePhrase));
+        final int summaryRes;
+        if (TAB_MOBILE.equals(mCurrentTab) || TAB_3G.equals(mCurrentApp)
+                || TAB_4G.equals(mCurrentApp)) {
+            summaryRes = R.string.data_usage_total_during_range_mobile;
+        } else {
+            summaryRes = R.string.data_usage_total_during_range;
+        }
+
+        mUsageSummary.setText(getString(summaryRes, totalPhrase, rangePhrase));
     }
 
     private final LoaderCallbacks<ChartData> mChartDataCallbacks = new LoaderCallbacks<
@@ -1191,13 +1198,15 @@
 
         @Override
         public void onLoadFinished(Loader<NetworkStats> loader, NetworkStats data) {
-            mAdapter.bindStats(data);
+            final int[] restrictedAppIds = mPolicyManager.getAppsWithPolicy(
+                    POLICY_REJECT_METERED_BACKGROUND);
+            mAdapter.bindStats(data, restrictedAppIds);
             updateEmptyVisible();
         }
 
         @Override
         public void onLoaderReset(Loader<NetworkStats> loader) {
-            mAdapter.bindStats(null);
+            mAdapter.bindStats(null, new int[0]);
             updateEmptyVisible();
         }
 
@@ -1374,6 +1383,7 @@
 
     public static class AppItem implements Comparable<AppItem>, Parcelable {
         public final int appId;
+        public boolean restricted;
         public SparseBooleanArray uids = new SparseBooleanArray();
         public long total;
 
@@ -1439,7 +1449,7 @@
         /**
          * Bind the given {@link NetworkStats}, or {@code null} to clear list.
          */
-        public void bindStats(NetworkStats stats) {
+        public void bindStats(NetworkStats stats, int[] restrictedAppIds) {
             mItems.clear();
 
             final AppItem systemItem = new AppItem(android.os.Process.SYSTEM_UID);
@@ -1468,6 +1478,16 @@
                 }
             }
 
+            for (int appId : restrictedAppIds) {
+                AppItem item = knownUids.get(appId);
+                if (item == null) {
+                    item = new AppItem(appId);
+                    item.total = -1;
+                    mItems.add(item);
+                }
+                item.restricted = true;
+            }
+
             if (systemItem.total > 0) {
                 mItems.add(systemItem);
             }
@@ -1513,7 +1533,13 @@
             final AppItem item = mItems.get(position);
             UidDetailTask.bindView(mProvider, item, convertView);
 
-            text1.setText(Formatter.formatFileSize(context, item.total));
+            if (item.restricted && item.total <= 0) {
+                text1.setText(R.string.data_usage_app_restricted);
+                progress.setVisibility(View.GONE);
+            } else {
+                text1.setText(Formatter.formatFileSize(context, item.total));
+                progress.setVisibility(View.VISIBLE);
+            }
 
             final int percentTotal = mLargest != 0 ? (int) (item.total * 100 / mLargest) : 0;
             progress.setProgress(percentTotal);
@@ -1580,16 +1606,13 @@
             // TODO: customize default limits based on network template
             final String currentTab = parent.mCurrentTab;
             if (TAB_3G.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_tab_3g);
+                message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = 5 * GB_IN_BYTES;
             } else if (TAB_4G.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_tab_4g);
+                message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = 5 * GB_IN_BYTES;
             } else if (TAB_MOBILE.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_list_mobile);
-                limitBytes = 5 * GB_IN_BYTES;
-            } else if (TAB_WIFI.equals(currentTab)) {
-                message = buildDialogMessage(res, R.string.data_usage_tab_wifi);
+                message = res.getString(R.string.data_usage_limit_dialog_mobile);
                 limitBytes = 5 * GB_IN_BYTES;
             } else {
                 throw new IllegalArgumentException("unknown current tab: " + currentTab);
@@ -1605,10 +1628,6 @@
             dialog.show(parent.getFragmentManager(), TAG_CONFIRM_LIMIT);
         }
 
-        private static CharSequence buildDialogMessage(Resources res, int networkResId) {
-            return res.getString(R.string.data_usage_limit_dialog, res.getString(networkResId));
-        }
-
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
             final Context context = getActivity();
diff --git a/src/com/android/settings/net/ChartDataLoader.java b/src/com/android/settings/net/ChartDataLoader.java
index 830d006..e0336b7 100644
--- a/src/com/android/settings/net/ChartDataLoader.java
+++ b/src/com/android/settings/net/ChartDataLoader.java
@@ -21,6 +21,7 @@
 import static android.net.NetworkStats.TAG_NONE;
 import static android.net.NetworkStatsHistory.FIELD_RX_BYTES;
 import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
+import static android.text.format.DateUtils.HOUR_IN_MILLIS;
 
 import android.content.AsyncTaskLoader;
 import android.content.Context;
@@ -88,9 +89,6 @@
         data.network = mSession.getHistoryForNetwork(template, fields);
 
         if (app != null) {
-            data.detailDefault = null;
-            data.detailForeground = null;
-
             // load stats for current uid and template
             final int size = app.uids.size();
             for (int i = 0; i < size; i++) {
@@ -101,9 +99,15 @@
                         template, uid, SET_FOREGROUND, data.detailForeground);
             }
 
-            data.detail = new NetworkStatsHistory(data.detailForeground.getBucketDuration());
-            data.detail.recordEntireHistory(data.detailDefault);
-            data.detail.recordEntireHistory(data.detailForeground);
+            if (size > 0) {
+                data.detail = new NetworkStatsHistory(data.detailForeground.getBucketDuration());
+                data.detail.recordEntireHistory(data.detailDefault);
+                data.detail.recordEntireHistory(data.detailForeground);
+            } else {
+                data.detailDefault = new NetworkStatsHistory(HOUR_IN_MILLIS);
+                data.detailForeground = new NetworkStatsHistory(HOUR_IN_MILLIS);
+                data.detail = new NetworkStatsHistory(HOUR_IN_MILLIS);
+            }
         }
 
         return data;
