diff --git a/src/com/android/settings/applications/InstalledAppDetails.java b/src/com/android/settings/applications/InstalledAppDetails.java
index 8b5ff0b..fcdf899 100644
--- a/src/com/android/settings/applications/InstalledAppDetails.java
+++ b/src/com/android/settings/applications/InstalledAppDetails.java
@@ -17,6 +17,7 @@
 package com.android.settings.applications;
 
 import com.android.settings.R;
+import com.android.settings.Utils;
 import com.android.settings.applications.ApplicationsState.AppEntry;
 
 import android.app.Activity;
@@ -907,10 +908,12 @@
             mActivitiesButton.setEnabled(false);
         } else if(v == mClearDataButton) {
             if (mAppEntry.info.manageSpaceActivityName != null) {
-                Intent intent = new Intent(Intent.ACTION_DEFAULT);
-                intent.setClassName(mAppEntry.info.packageName,
-                        mAppEntry.info.manageSpaceActivityName);
-                startActivityForResult(intent, -1);
+                if (!Utils.isMonkeyRunning()) {
+                    Intent intent = new Intent(Intent.ACTION_DEFAULT);
+                    intent.setClassName(mAppEntry.info.packageName,
+                            mAppEntry.info.manageSpaceActivityName);
+                    startActivityForResult(intent, -1);
+                }
             } else {
                 showDialogInner(DLG_CLEAR_DATA, 0);
             }
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index b522077..769dc04 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -20,16 +20,18 @@
 
 import android.app.Activity;
 import android.app.Fragment;
+import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
+import android.content.ServiceConnection;
 import android.content.pm.ApplicationInfo;
 import android.content.pm.IPackageManager;
 import android.content.pm.PackageInfo;
 import android.os.Bundle;
 import android.os.Environment;
+import android.os.IBinder;
 import android.os.RemoteException;
 import android.os.ServiceManager;
-import android.os.StatFs;
 import android.preference.PreferenceActivity;
 import android.provider.Settings;
 import android.text.format.Formatter;
@@ -46,19 +48,19 @@
 import android.widget.AdapterView;
 import android.widget.AdapterView.OnItemClickListener;
 import android.widget.BaseAdapter;
-import android.widget.CheckBox;
 import android.widget.Filter;
 import android.widget.Filterable;
-import android.widget.ImageView;
 import android.widget.ListView;
 import android.widget.TabHost;
 import android.widget.TextView;
 
+import com.android.internal.app.IMediaContainerService;
 import com.android.internal.content.PackageHelper;
 import com.android.settings.R;
 import com.android.settings.Settings.RunningServicesActivity;
 import com.android.settings.Settings.StorageUseActivity;
 import com.android.settings.applications.ApplicationsState.AppEntry;
+import com.android.settings.deviceinfo.StorageMeasurement;
 
 import java.util.ArrayList;
 import java.util.Comparator;
@@ -179,8 +181,6 @@
     private boolean mResumedRunning;
     private boolean mActivityResumed;
     
-    private StatFs mDataFileStats;
-    private StatFs mSDCardFileStats;
     private boolean mLastShowedInternalStorage = true;
     private long mLastUsedStorage, mLastAppStorage, mLastFreeStorage;
 
@@ -534,8 +534,9 @@
         
         mDefaultTab = defaultTabTag;
         
-        mDataFileStats = new StatFs("/data");
-        mSDCardFileStats = new StatFs(Environment.getExternalStorageDirectory().toString());
+        final Intent containerIntent = new Intent().setComponent(
+                StorageMeasurement.DEFAULT_CONTAINER_COMPONENT);
+        getActivity().bindService(containerIntent, mContainerConnection, Context.BIND_AUTO_CREATE);
 
         mInvalidSizeStr = getActivity().getText(R.string.invalid_size_value);
         mComputingSizeStr = getActivity().getText(R.string.computing_size);
@@ -686,7 +687,13 @@
     public void onDestroyOptionsMenu() {
         mOptionsMenu = null;
     }
-    
+
+    @Override
+    public void onDestroy() {
+        getActivity().unbindService(mContainerConnection);
+        super.onDestroy();
+    }
+
     void updateOptionsMenu() {
         if (mOptionsMenu == null) {
             return;
@@ -760,15 +767,18 @@
                 mLastShowedInternalStorage = false;
             }
             newLabel = getActivity().getText(R.string.sd_card_storage);
-            mSDCardFileStats.restat(Environment.getExternalStorageDirectory().toString());
-            try {
-                totalStorage = (long)mSDCardFileStats.getBlockCount() *
-                        mSDCardFileStats.getBlockSize();
-                freeStorage = (long) mSDCardFileStats.getAvailableBlocks() *
-                mSDCardFileStats.getBlockSize();
-            } catch (IllegalArgumentException e) {
-                // use the old value of mFreeMem
+
+            if (mContainerService != null) {
+                try {
+                    final long[] stats = mContainerService.getFileSystemStats(
+                            Environment.getExternalStorageDirectory().getPath());
+                    totalStorage = stats[0];
+                    freeStorage = stats[1];
+                } catch (RemoteException e) {
+                    Log.w(TAG, "Problem in container service", e);
+                }
             }
+
             final int N = mApplicationsAdapter.getCount();
             for (int i=0; i<N; i++) {
                 ApplicationsState.AppEntry ae = mApplicationsAdapter.getAppEntry(i);
@@ -779,14 +789,18 @@
                 mLastShowedInternalStorage = true;
             }
             newLabel = getActivity().getText(R.string.internal_storage);
-            mDataFileStats.restat("/data");
-            try {
-                totalStorage = (long)mDataFileStats.getBlockCount() *
-                        mDataFileStats.getBlockSize();
-                freeStorage = (long) mDataFileStats.getAvailableBlocks() *
-                    mDataFileStats.getBlockSize();
-            } catch (IllegalArgumentException e) {
+
+            if (mContainerService != null) {
+                try {
+                    final long[] stats = mContainerService.getFileSystemStats(
+                            Environment.getDataDirectory().getPath());
+                    totalStorage = stats[0];
+                    freeStorage = stats[1];
+                } catch (RemoteException e) {
+                    Log.w(TAG, "Problem in container service", e);
+                }
             }
+
             final boolean emulatedStorage = Environment.isExternalStorageEmulated();
             final int N = mApplicationsAdapter.getCount();
             for (int i=0; i<N; i++) {
@@ -912,4 +926,19 @@
     public void onTabChanged(String tabId) {
         showCurrentTab();
     }
+
+    private volatile IMediaContainerService mContainerService;
+
+    private final ServiceConnection mContainerConnection = new ServiceConnection() {
+        @Override
+        public void onServiceConnected(ComponentName name, IBinder service) {
+            mContainerService = IMediaContainerService.Stub.asInterface(service);
+            updateStorageUsage();
+        }
+
+        @Override
+        public void onServiceDisconnected(ComponentName name) {
+            mContainerService = null;
+        }
+    };
 }
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
index d0eef62..b9ea432 100644
--- a/src/com/android/settings/deviceinfo/Memory.java
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -48,6 +48,7 @@
 
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
+import com.android.settings.Utils;
 
 public class Memory extends SettingsPreferenceFragment {
     private static final String TAG = "MemorySettings";
@@ -237,7 +238,10 @@
             StorageVolumePreferenceCategory svpc = mStorageVolumePreferenceCategories[i];
             Intent intent = svpc.intentForClick(preference);
             if (intent != null) {
-                startActivity(intent);
+                // Don't go across app boundary if monkey is running
+                if (!Utils.isMonkeyRunning()) {
+                    startActivity(intent);
+                }
                 return true;
             }
 
diff --git a/src/com/android/settings/deviceinfo/StorageMeasurement.java b/src/com/android/settings/deviceinfo/StorageMeasurement.java
index b4004e9..2792d09 100644
--- a/src/com/android/settings/deviceinfo/StorageMeasurement.java
+++ b/src/com/android/settings/deviceinfo/StorageMeasurement.java
@@ -31,7 +31,7 @@
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
-import android.os.StatFs;
+import android.os.RemoteException;
 import android.os.storage.StorageVolume;
 import android.util.Log;
 
@@ -53,7 +53,7 @@
  * know about by just keeping an array of measurement types of the following
  * properties:
  *
- *   Filesystem stats (using StatFs)
+ *   Filesystem stats (using DefaultContainerService)
  *   Directory measurements (using DefaultContainerService.measureDir)
  *   Application measurements (using PackageManager)
  *
@@ -81,7 +81,7 @@
 
     private static final String DEFAULT_CONTAINER_PACKAGE = "com.android.defcontainer";
 
-    private static final ComponentName DEFAULT_CONTAINER_COMPONENT = new ComponentName(
+    public static final ComponentName DEFAULT_CONTAINER_COMPONENT = new ComponentName(
             DEFAULT_CONTAINER_PACKAGE, "com.android.defcontainer.DefaultContainerService");
 
     private final MeasurementHandler mHandler;
@@ -258,8 +258,6 @@
                         return;
                     }
 
-                    measureApproximateStorage();
-
                     synchronized (mLock) {
                         if (mBound) {
                             removeMessages(MSG_DISCONNECT);
@@ -274,6 +272,7 @@
                 }
                 case MSG_CONNECTED: {
                     IMediaContainerService imcs = (IMediaContainerService) msg.obj;
+                    measureApproximateStorage(imcs);
                     measureExactStorage(imcs);
                     break;
                 }
@@ -367,15 +366,16 @@
             sendEmptyMessage(MSG_COMPLETED);
         }
 
-        private void measureApproximateStorage() {
-            final StatFs stat = new StatFs(mStorageVolume != null
-                    ? mStorageVolume.getPath() : Environment.getDataDirectory().getPath());
-            final long blockSize = stat.getBlockSize();
-            final long totalBlocks = stat.getBlockCount();
-            final long availableBlocks = stat.getAvailableBlocks();
-
-            mTotalSize = totalBlocks * blockSize;
-            mAvailSize = availableBlocks * blockSize;
+        private void measureApproximateStorage(IMediaContainerService imcs) {
+            final String path = mStorageVolume != null ? mStorageVolume.getPath()
+                    : Environment.getDataDirectory().getPath();
+            try {
+                final long[] stats = imcs.getFileSystemStats(path);
+                mTotalSize = stats[0];
+                mAvailSize = stats[1];
+            } catch (RemoteException e) {
+                Log.w(TAG, "Problem in container service", e);
+            }
 
             sendInternalApproximateUpdate();
         }
