diff --git a/src/com/android/settings/DataUsageSummary.java b/src/com/android/settings/DataUsageSummary.java
index 82dee0f..bed3be5 100644
--- a/src/com/android/settings/DataUsageSummary.java
+++ b/src/com/android/settings/DataUsageSummary.java
@@ -37,10 +37,12 @@
 import android.app.DialogFragment;
 import android.app.Fragment;
 import android.app.FragmentTransaction;
+import android.app.LoaderManager.LoaderCallbacks;
 import android.content.ContentResolver;
 import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
+import android.content.Loader;
 import android.content.SharedPreferences;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageInfo;
@@ -97,6 +99,7 @@
 
 import com.android.internal.telephony.Phone;
 import com.android.settings.net.NetworkPolicyEditor;
+import com.android.settings.net.SummaryForAllUidLoader;
 import com.android.settings.widget.DataUsageChartView;
 import com.android.settings.widget.DataUsageChartView.DataUsageChartListener;
 import com.google.android.collect.Lists;
@@ -127,6 +130,8 @@
     private static final String TAG_CONFIRM_APP_RESTRICT = "confirmAppRestrict";
     private static final String TAG_APP_DETAILS = "appDetails";
 
+    private static final int LOADER_SUMMARY = 2;
+
     private static final long KB_IN_BYTES = 1024;
     private static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
     private static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
@@ -305,6 +310,23 @@
         if (ACTION_DATA_USAGE_LIMIT.equals(action)) {
             PolicyLimitFragment.show(this);
         }
+
+        // kick off background task to update stats
+        new AsyncTask<Void, Void, Void>() {
+            @Override
+            protected Void doInBackground(Void... params) {
+                try {
+                    mStatsService.forceUpdate();
+                } catch (RemoteException e) {
+                }
+                return null;
+            }
+
+            @Override
+            protected void onPostExecute(Void result) {
+                updateBody();
+            }
+        }.execute();
     }
 
     @Override
@@ -894,33 +916,35 @@
                 mAppSubtitle.setText(Formatter.formatFileSize(context, totalCombined));
             }
 
-            // clear any existing app list details
-            mAdapter.bindStats(null);
+            getLoaderManager().destroyLoader(LOADER_SUMMARY);
 
-            return;
+        } else {
+            // kick off loader for detailed stats
+            final long[] range = mChart.getInspectRange();
+            getLoaderManager().restartLoader(LOADER_SUMMARY,
+                    SummaryForAllUidLoader.buildArgs(mTemplate, range[0], range[1]),
+                    mSummaryForAllUid);
+
+        }
+    }
+
+    private final LoaderCallbacks<NetworkStats> mSummaryForAllUid = new LoaderCallbacks<
+            NetworkStats>() {
+        /** {@inheritDoc} */
+        public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
+            return new SummaryForAllUidLoader(getActivity(), mStatsService, args);
         }
 
-        // otherwise kick off task to update list
-        new AsyncTask<Void, Void, NetworkStats>() {
-            @Override
-            protected NetworkStats doInBackground(Void... params) {
-                try {
-                    final long[] range = mChart.getInspectRange();
-                    return mStatsService.getSummaryForAllUid(mTemplate, range[0], range[1], false);
-                } catch (RemoteException e) {
-                    Log.w(TAG, "problem reading stats");
-                }
-                return null;
-            }
+        /** {@inheritDoc} */
+        public void onLoadFinished(Loader<NetworkStats> loader, NetworkStats data) {
+            mAdapter.bindStats(data);
+        }
 
-            @Override
-            protected void onPostExecute(NetworkStats stats) {
-                if (stats != null) {
-                    mAdapter.bindStats(stats);
-                }
-            }
-        }.execute();
-    }
+        /** {@inheritDoc} */
+        public void onLoaderReset(Loader<NetworkStats> loader) {
+            mAdapter.bindStats(null);
+        }
+    };
 
     private boolean isMobilePolicySplit() {
         final String subscriberId = getActiveSubscriberId(getActivity());
@@ -1535,5 +1559,4 @@
         summary.setVisibility(View.VISIBLE);
         summary.setText(resId);
     }
-
 }
diff --git a/src/com/android/settings/net/SummaryForAllUidLoader.java b/src/com/android/settings/net/SummaryForAllUidLoader.java
new file mode 100644
index 0000000..c01de45
--- /dev/null
+++ b/src/com/android/settings/net/SummaryForAllUidLoader.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2011 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.net;
+
+import android.content.AsyncTaskLoader;
+import android.content.Context;
+import android.net.INetworkStatsService;
+import android.net.NetworkStats;
+import android.net.NetworkTemplate;
+import android.os.Bundle;
+import android.os.RemoteException;
+
+public class SummaryForAllUidLoader extends AsyncTaskLoader<NetworkStats> {
+    private static final String KEY_TEMPLATE = "template";
+    private static final String KEY_START = "start";
+    private static final String KEY_END = "end";
+
+    private final INetworkStatsService mStatsService;
+    private final Bundle mArgs;
+
+    public static Bundle buildArgs(NetworkTemplate template, long start, long end) {
+        final Bundle args = new Bundle();
+        args.putParcelable(KEY_TEMPLATE, template);
+        args.putLong(KEY_START, start);
+        args.putLong(KEY_END, end);
+        return args;
+    }
+
+    public SummaryForAllUidLoader(
+            Context context, INetworkStatsService statsService, Bundle args) {
+        super(context);
+        mStatsService = statsService;
+        mArgs = args;
+    }
+
+    @Override
+    protected void onStartLoading() {
+        super.onStartLoading();
+        forceLoad();
+    }
+
+    @Override
+    public NetworkStats loadInBackground() {
+        final NetworkTemplate template = mArgs.getParcelable(KEY_TEMPLATE);
+        final long start = mArgs.getLong(KEY_START);
+        final long end = mArgs.getLong(KEY_END);
+
+        try {
+            return mStatsService.getSummaryForAllUid(template, start, end, false);
+        } catch (RemoteException e) {
+            return null;
+        }
+    }
+
+    @Override
+    protected void onStopLoading() {
+        super.onStopLoading();
+        cancelLoad();
+    }
+
+    @Override
+    protected void onReset() {
+        super.onReset();
+        cancelLoad();
+    }
+}
