diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index a7066e0..c986d3b 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -700,14 +700,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name="SdCardSettings" android:label="@string/sd_card_settings_label">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.DEVELOPMENT_PREFERENCE" />
-                <category android:name="android.intent.category.VOICE_LAUNCH" />
-            </intent-filter>
-        </activity>
-
         <activity android:name="ProxySelector" android:label="@string/proxy_settings_label"
                 android:theme="@android:style/Theme.Dialog">
             <intent-filter>
diff --git a/res/layout/sdcard_settings_screen.xml b/res/layout/sdcard_settings_screen.xml
deleted file mode 100644
index 3fa6c9a..0000000
--- a/res/layout/sdcard_settings_screen.xml
+++ /dev/null
@@ -1,132 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/* //device/apps/Settings/res/layout/sdcard_settings_screen.xml
-**
-** Copyright 2007, 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.
-*/
--->
-<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <LinearLayout android:id="@+id/list"
-        android:orientation="vertical"
-        android:padding="10dip"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content">
-    
-        <LinearLayout android:id="@+id/usb"
-            android:orientation="vertical"
-            android:paddingBottom="10dip"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content">
-
-            <CheckBox android:id="@+id/mass_storage"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content" 
-                android:text="@string/sdcard_settings_screen_mass_storage_text">
-                <requestFocus/>
-            </CheckBox>
-            
-            <TextView android:text="@string/sdcard_changes_instructions" style="@style/info_small" />
-        </LinearLayout>
-        
-        <!-- divider line -->
-        <View android:background="#FF000000"
-            android:layout_width="match_parent"
-            android:layout_height="1dip" />
-    
-        <LinearLayout android:id="@+id/mounted" 
-            android:orientation="vertical" 
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:paddingTop="10dip">
-            
-            <TextView android:id="@+id/read_only"
-                android:text="@string/sdcard_settings_read_only_status" 
-                style="@style/info_label" />
-            
-            <Button android:id="@+id/sdcard_unmount"
-                android:text="@string/sdcard_unmount" 
-                android:textSize="14sp"
-                android:layout_marginTop="8dip"
-                android:layout_width="wrap_content" android:layout_height="wrap_content" />
-
-            <Button android:id="@+id/sdcard_format"
-                android:text="@string/sdcard_format" 
-                android:textSize="14sp"
-                android:layout_marginTop="8dip"
-                android:layout_width="wrap_content" android:layout_height="wrap_content" />
-    
-            <TableLayout
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"
-                android:paddingTop="10dip">
-                <TableRow>
-                    <TextView android:text="@string/sdcard_settings_total_bytes_label" style="@style/info_label" />
-                    <TextView android:id="@+id/total" style="@style/info_value" />
-                </TableRow>
-                <TableRow>
-                    <TextView android:text="@string/sdcard_settings_used_bytes_label" style="@style/info_label" />
-                    <TextView android:id="@+id/used" style="@style/info_value" />
-                </TableRow>
-                <TableRow>
-                    <TextView android:text="@string/sdcard_settings_available_bytes_label" style="@style/info_label" />
-                    <TextView android:id="@+id/available" style="@style/info_value" />
-                </TableRow>
-            </TableLayout>
-    
-        </LinearLayout>
-    
-        <LinearLayout style="@style/entry_layout" 
-            android:id="@+id/scanning" 
-            android:paddingTop="10dip">
-            <TextView android:text="@string/sdcard_settings_scanning_status" style="@style/info_label" />
-        </LinearLayout>
-
-        <LinearLayout style="@style/entry_layout" 
-            android:id="@+id/removed" 
-            android:paddingTop="10dip">
-            <TextView android:text="@string/sdcard_settings_not_present_status" style="@style/info_label" />
-        </LinearLayout>
-
-        <LinearLayout android:id="@+id/shared" 
-            android:orientation="vertical" 
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content" 
-            android:paddingTop="10dip">
-        
-            <LinearLayout style="@style/entry_layout" >
-                <TextView android:text="@string/sdcard_settings_mass_storage_status" style="@style/info_label" />
-            </LinearLayout>
- 
-        </LinearLayout>
-
-        <LinearLayout style="@style/entry_layout" 
-            android:id="@+id/unmounted" 
-            android:paddingTop="10dip">
-            <TextView android:text="@string/sdcard_settings_unmounted_status" style="@style/info_label" />
-        </LinearLayout>
-
-        <LinearLayout style="@style/entry_layout" 
-            android:id="@+id/bad_removal" 
-            android:paddingTop="10dip">
-            <TextView android:text="@string/sdcard_settings_bad_removal_status" style="@style/info_label" />
-        </LinearLayout>
-    
-    </LinearLayout>
-</ScrollView>
-
diff --git a/res/values/strings.xml b/res/values/strings.xml
index bc19df5..4808a69 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1203,6 +1203,21 @@
     <string name="sd_unavailable">Unavailable</string>
     <!-- SD card status when it is mounted as read only  -->
     <string name="read_only">\u0020(Read-only)</string>
+    <!-- SD card eject confirmation dialog title   -->
+    <string name="dlg_confirm_unmount_title">Unmount sdcard</string>
+    <!-- SD card eject confirmation dialog  -->
+    <string name="dlg_confirm_unmount_text">Some processes accessing data on sdcard will be killed. Do you want to continue?</string>
+    <!-- SD card eject error dialog title   -->
+    <string name="dlg_error_unmount_title">Unmount sdcard failed</string>
+    <!-- SD card eject error dialog text   -->
+    <string name="dlg_error_unmount_text">Cannot unmount sdcard. Try again later.</string>
+    <!-- SD card unmount informative text   -->
+    <string name="unmount_inform_text">Sdcard will be unmounted. Check the notification area for status.</string>
+    <!-- SD card eject progress title   -->
+    <string name="sd_ejecting_title">Unmounting</string>
+    <!-- SD card eject progress text   -->
+    <string name="sd_ejecting_summary">Unmount in progress</string>
+
     <!-- Phone info screen, section titles: -->
     <string name="battery_status_title">Battery status</string>
     <!-- Phone info screen, section titles: -->
diff --git a/src/com/android/settings/AccessibilitySettings.java b/src/com/android/settings/AccessibilitySettings.java
index 1d6db20..276a22f 100644
--- a/src/com/android/settings/AccessibilitySettings.java
+++ b/src/com/android/settings/AccessibilitySettings.java
@@ -105,8 +105,6 @@
         if (!accessibilityServices.isEmpty()) {
             if (serviceState == 1) {
                 mToggleCheckBox.setChecked(true);
-            } else {
-                setAccessibilityServicePreferencesState(false);
             }
             mToggleCheckBox.setEnabled(true);
         } else {
@@ -114,7 +112,6 @@
                 // no service and accessibility is enabled => disable
                 Settings.Secure.putInt(getContentResolver(),
                     Settings.Secure.ACCESSIBILITY_ENABLED, 0);
-                setAccessibilityServicePreferencesState(false);
             }
             mToggleCheckBox.setEnabled(false);
             // Notify user that they do not have any accessibility apps
@@ -130,26 +127,6 @@
         persistEnabledAccessibilityServices();
     }
 
-    /**
-     * Sets the state of the preferences for enabling/disabling AccessibilityServices.
-     *
-     * @param isEnabled If to enable or disable the preferences.
-     */
-    private void setAccessibilityServicePreferencesState(boolean isEnabled) {
-        if (mAccessibilityServicesCategory == null) {
-            return;
-        }
-
-        int count = mAccessibilityServicesCategory.getPreferenceCount();
-        for (int i = 0; i < count; i++) {
-            Preference pref = mAccessibilityServicesCategory.getPreference(i);
-            pref.setEnabled(isEnabled);
-            if (!isEnabled){
-               ((CheckBoxPreference) pref).setChecked(false);
-            }
-        }
-    }
-
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
         final String key = preference.getKey();
@@ -173,7 +150,6 @@
         if (preference.isChecked()) {
             Settings.Secure.putInt(getContentResolver(),
                 Settings.Secure.ACCESSIBILITY_ENABLED, 1);
-            setAccessibilityServicePreferencesState(true);
         } else {
             final CheckBoxPreference checkBoxPreference = preference;
             AlertDialog dialog = (new AlertDialog.Builder(this))
@@ -186,7 +162,6 @@
                         public void onClick(DialogInterface dialog, int which) {
                             Settings.Secure.putInt(getContentResolver(),
                                 Settings.Secure.ACCESSIBILITY_ENABLED, 0);
-                            setAccessibilityServicePreferencesState(false);
                         }
                 })
                 .setNegativeButton(android.R.string.cancel,
diff --git a/src/com/android/settings/SdCardIntentReceiver.java b/src/com/android/settings/SdCardIntentReceiver.java
deleted file mode 100644
index 9648ec1..0000000
--- a/src/com/android/settings/SdCardIntentReceiver.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2007 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.app.Notification;
-import android.app.NotificationManager;
-import android.content.Context;
-import android.content.Intent;
-import android.content.BroadcastReceiver;
-import android.util.Config;
-import android.util.Log;
-
-/**
- * 
- */
-public class SdCardIntentReceiver extends BroadcastReceiver {
-
-    private static final int SDCARD_STATUS = 1;
-    private static final String TAG = "SdCardIntentReceiver";
-
-    @Override
-    public void onReceive(Context context, Intent intent) {
-        NotificationManager nm = (NotificationManager) context
-                .getSystemService(Context.NOTIFICATION_SERVICE);
-        String action = intent.getAction();
-        if (Config.LOGD) Log.d(TAG, "onReceiveIntent " + action);
-
-        if (action.equals(Intent.ACTION_MEDIA_MOUNTED)) {
-            nm.cancel(SDCARD_STATUS);
-
-            Intent statusIntent = new Intent(Intent.ACTION_MAIN, null);
-            statusIntent.setClass(context, SdCardSettings.class);
-            nm.notify(SDCARD_STATUS, new Notification(context,
-                    android.R.drawable.stat_notify_sdcard,
-                    null,
-                    System.currentTimeMillis(),
-                    context.getText(R.string.sdcard_setting),
-                    null,
-                    statusIntent));
-        } else if (action.equals(Intent.ACTION_MEDIA_REMOVED)) {
-            nm.cancel(SDCARD_STATUS);
-        } else if (action.equals(Intent.ACTION_MEDIA_SHARED)) {
-            nm.cancel(SDCARD_STATUS);
-
-            Intent statusIntent = new Intent(Intent.ACTION_MAIN, null);
-            statusIntent.setClass(context, SdCardSettings.class);
-            nm.notify(SDCARD_STATUS, new Notification(context,
-                    android.R.drawable.stat_notify_sdcard_usb,
-                    null,
-                    System.currentTimeMillis(),
-                    "SD Card",
-                    null,
-                    statusIntent));
-        }
-    }
-}
diff --git a/src/com/android/settings/SdCardSettings.java b/src/com/android/settings/SdCardSettings.java
deleted file mode 100644
index 87e8fb3..0000000
--- a/src/com/android/settings/SdCardSettings.java
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Copyright (C) 2007 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.app.Activity;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.os.Bundle;
-import android.os.RemoteException;
-import android.os.Environment;
-import android.os.ServiceManager;
-import android.os.StatFs;
-import android.os.storage.StorageManager;
-import android.os.storage.IMountService;
-import android.text.format.Formatter;
-import android.view.View;
-import android.view.View.OnClickListener;
-import android.widget.Button;
-import android.widget.CheckBox;
-import android.widget.TextView;
-
-import java.io.File;
-
-
-public class SdCardSettings extends Activity
-{
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        setContentView(R.layout.sdcard_settings_screen);
-
-        mStorageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
-        mMountService = IMountService.Stub.asInterface(ServiceManager.getService("mount"));
-
-        mRemovedLayout = findViewById(R.id.removed);
-        mMountedLayout = findViewById(R.id.mounted);
-        mUnmountedLayout = findViewById(R.id.unmounted);
-        mScanningLayout = findViewById(R.id.scanning);
-        mSharedLayout = findViewById(R.id.shared);
-        mBadRemovalLayout = findViewById(R.id.bad_removal);
-        mReadOnlyStatus = findViewById(R.id.read_only);
-
-        mMassStorage = (CheckBox)findViewById(R.id.mass_storage);
-        mMassStorage.setOnClickListener(mMassStorageListener);
-
-        Button unmountButton = (Button)findViewById(R.id.sdcard_unmount);
-        unmountButton.setOnClickListener(mUnmountButtonHandler);
-
-        Button formatButton = (Button)findViewById(R.id.sdcard_format);
-        formatButton.setOnClickListener(mFormatButtonHandler);
-
-        mTotalSize = (TextView)findViewById(R.id.total);
-        mUsedSize = (TextView)findViewById(R.id.used);
-        mAvailableSize = (TextView)findViewById(R.id.available);
-
-        // install an intent filter to receive SD card related events.
-        IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_REMOVED);
-        intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);
-        intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
-        intentFilter.addAction(Intent.ACTION_MEDIA_SHARED);
-        intentFilter.addAction(Intent.ACTION_MEDIA_CHECKING);
-        intentFilter.addAction(Intent.ACTION_MEDIA_NOFS);
-        intentFilter.addAction(Intent.ACTION_MEDIA_BAD_REMOVAL);
-        intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_STARTED);
-        intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
-        intentFilter.addDataScheme("file");
-        registerReceiver(mReceiver, intentFilter);
-    }
-
-    @Override
-    protected void onDestroy() {
-        super.onDestroy();
-    }
-
-    @Override
-    public void onResume() {
-        super.onResume();
-        update();
-    }
-
-    private void setLayout(View layout) {
-        mRemovedLayout.setVisibility(layout == mRemovedLayout ? View.VISIBLE : View.GONE);
-        mMountedLayout.setVisibility(layout == mMountedLayout ? View.VISIBLE : View.GONE);
-        mUnmountedLayout.setVisibility(layout == mUnmountedLayout ? View.VISIBLE : View.GONE);
-        mScanningLayout.setVisibility(layout == mScanningLayout ? View.VISIBLE : View.GONE);
-        mSharedLayout.setVisibility(layout == mSharedLayout ? View.VISIBLE : View.GONE);
-        mBadRemovalLayout.setVisibility(layout == mBadRemovalLayout ? View.VISIBLE : View.GONE);
-    }
-
-    private void update() {
-
-        try {
-            mMassStorage.setChecked(mStorageManager.isUsbMassStorageEnabled());
-        } catch (Exception ex) {
-        }
-
-        String status = Environment.getExternalStorageState();
-        boolean readOnly = false;
-
-        if (status.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
-            status = Environment.MEDIA_MOUNTED;
-            readOnly = true;
-        }
-
-        if (status.equals(Environment.MEDIA_MOUNTED)) {
-            try {
-                File path = Environment.getExternalStorageDirectory();
-                StatFs stat = new StatFs(path.getPath());
-                long blockSize = stat.getBlockSize();
-                long totalBlocks = stat.getBlockCount();
-                long availableBlocks = stat.getAvailableBlocks();
-
-                mTotalSize.setText(formatSize(totalBlocks * blockSize));
-                mUsedSize.setText(formatSize((totalBlocks - availableBlocks) * blockSize));
-                mAvailableSize.setText(formatSize(availableBlocks * blockSize));
-            } catch (IllegalArgumentException e) {
-                // this can occur if the SD card is removed, but we haven't received the
-                // ACTION_MEDIA_REMOVED Intent yet.
-                status = Environment.MEDIA_REMOVED;
-            }
-
-            mReadOnlyStatus.setVisibility(readOnly ? View.VISIBLE : View.GONE);
-            setLayout(mMountedLayout);
-        } else if (status.equals(Environment.MEDIA_UNMOUNTED)) {
-            setLayout(mUnmountedLayout);
-        } else if (status.equals(Environment.MEDIA_REMOVED)) {
-            setLayout(mRemovedLayout);
-        } else if (status.equals(Environment.MEDIA_SHARED)) {
-            setLayout(mSharedLayout);
-        } else if (status.equals(Environment.MEDIA_BAD_REMOVAL)) {
-            setLayout(mBadRemovalLayout);
-        }
-    }
-
-    private String formatSize(long size) {
-        return Formatter.formatFileSize(this, size);
-    }
-
-    OnClickListener mMassStorageListener = new OnClickListener() {
-        public void onClick(View v) {
-            try {
-                if (mMassStorage.isChecked()) {
-                    mStorageManager.enableUsbMassStorage();
-                } else {
-                    mStorageManager.disableUsbMassStorage();
-                }
-            } catch (Exception ex) {
-            }
-        }
-    };
-
-    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            update();
-        }
-    };
-
-    OnClickListener mUnmountButtonHandler = new OnClickListener() {
-        public void onClick(View v) {
-            try {
-                mMountService.unmountVolume(Environment.getExternalStorageDirectory().toString(), false);
-            } catch (RemoteException ex) {
-            }
-        }
-    };
-
-    OnClickListener mFormatButtonHandler = new OnClickListener() {
-        public void onClick(View v) {
-            try {
-                mMountService.formatVolume(Environment.getExternalStorageDirectory().toString());
-            } catch (RemoteException ex) {
-            }
-        }
-    };
-
-    private StorageManager mStorageManager;
-    private IMountService mMountService;
-
-    private CheckBox    mMassStorage;
-
-    private TextView    mTotalSize;
-    private TextView    mUsedSize;
-    private TextView    mAvailableSize;
-
-    private View        mRemovedLayout;
-    private View        mMountedLayout;
-    private View        mUnmountedLayout;
-    private View        mScanningLayout;
-    private View        mSharedLayout;
-    private View        mBadRemovalLayout;
-    private View        mReadOnlyStatus;
-}
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java
index 53c641a..fa217ad 100644
--- a/src/com/android/settings/deviceinfo/Memory.java
+++ b/src/com/android/settings/deviceinfo/Memory.java
@@ -16,13 +16,19 @@
 
 package com.android.settings.deviceinfo;
 
+import android.app.AlertDialog;
+import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
+import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.DialogInterface.OnCancelListener;
 import android.content.res.Resources;
 import android.os.Bundle;
+import android.os.Handler;
 import android.os.IBinder;
+import android.os.Message;
 import android.os.RemoteException;
 import android.os.Environment;
 import android.os.storage.IMountService;
@@ -35,15 +41,15 @@
 import android.preference.PreferenceScreen;
 import android.text.format.Formatter;
 import android.util.Log;
+import android.widget.Toast;
 
 import com.android.settings.R;
 
 import java.io.File;
-import java.text.DecimalFormat;
 
-public class Memory extends PreferenceActivity {
-    
+public class Memory extends PreferenceActivity implements OnCancelListener {
     private static final String TAG = "Memory";
+    private static final boolean localLOGV = false;
 
     private static final String MEMORY_SD_SIZE = "memory_sd_size";
 
@@ -52,6 +58,10 @@
     private static final String MEMORY_SD_MOUNT_TOGGLE = "memory_sd_mount_toggle";
 
     private static final String MEMORY_SD_FORMAT = "memory_sd_format";
+
+    private static final int DLG_CONFIRM_UNMOUNT = 1;
+    private static final int DLG_ERROR_UNMOUNT = 2;
+
     private Resources mRes;
 
     private Preference mSdSize;
@@ -98,6 +108,9 @@
 
         @Override
         public void onStorageStateChanged(String path, String oldState, String newState) {
+            Log.i(TAG, "Received storage state changed notification that " +
+                    path + " changed state from " + oldState +
+                    " to " + newState);
             updateMemoryStatus();
         }
     };
@@ -107,7 +120,15 @@
         super.onPause();
         unregisterReceiver(mReceiver);
     }
-    
+
+    @Override
+    protected void onDestroy() {
+        if (mStorageManager != null && mStorageListener != null) {
+            mStorageManager.unregisterListener(mStorageListener);
+        }
+        super.onDestroy();
+    }
+
     private synchronized IMountService getMountService() {
        if (mMountService == null) {
            IBinder service = ServiceManager.getService("mount");
@@ -147,19 +168,80 @@
         }
     };
 
-    private void unmount() {
-        IMountService mountService = getMountService();
-        try {
-            if (mountService != null) {
-                mountService.unmountVolume(Environment.getExternalStorageDirectory().toString(), false);
-            } else {
-                Log.e(TAG, "Mount service is null, can't unmount");
-            }
-        } catch (RemoteException ex) {
+    @Override
+    public Dialog onCreateDialog(int id, Bundle args) {
+        switch (id) {
+        case DLG_CONFIRM_UNMOUNT:
+            return new AlertDialog.Builder(this)
+                    .setTitle(R.string.dlg_confirm_unmount_title)
+                    .setPositiveButton(R.string.dlg_ok, new DialogInterface.OnClickListener() {
+                        public void onClick(DialogInterface dialog, int which) {
+                            doUnmount(true);
+                        }})
+                    .setNegativeButton(R.string.cancel, null)
+                    .setMessage(R.string.dlg_confirm_unmount_text)
+                    .setOnCancelListener(this)
+                    .create();
+        case DLG_ERROR_UNMOUNT:
+            return new AlertDialog.Builder(this                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            )
+            .setTitle(R.string.dlg_error_unmount_title)
+            .setNeutralButton(R.string.dlg_ok, null)
+            .setMessage(R.string.dlg_error_unmount_text)
+            .setOnCancelListener(this)
+            .create();
         }
-        updateMemoryStatus();
+        return null;
     }
 
+    private void doUnmount(boolean force) {
+        // Present a toast here
+        Toast.makeText(this, R.string.unmount_inform_text, Toast.LENGTH_SHORT).show();
+        IMountService mountService = getMountService();
+        String extStoragePath = Environment.getExternalStorageDirectory().toString();
+        try {
+            mSdMountToggle.setEnabled(false);
+            mSdMountToggle.setTitle(mRes.getString(R.string.sd_ejecting_title));
+            mSdMountToggle.setSummary(mRes.getString(R.string.sd_ejecting_summary));
+            mountService.unmountVolume(extStoragePath, force);
+        } catch (RemoteException e) {
+            // Informative dialog to user that
+            // unmount failed.
+            showDialogInner(DLG_ERROR_UNMOUNT);
+        }
+    }
+
+    private void showDialogInner(int id) {
+        removeDialog(id);
+        showDialog(id);
+    }
+
+    private void unmount() {
+        // Check if the sdcard is being accessed by other processes
+        // and let the user decide if the sdcard should be ejected.
+        String extStoragePath = Environment.
+        getExternalStorageDirectory().toString();
+        IMountService mountService = getMountService();
+        int stUsers[] = null;
+        try {
+            stUsers = mountService.getStorageUsers(extStoragePath);
+        } catch (RemoteException e) {
+            // Very unlikely. But present an error dialog anyway
+            Log.e(TAG, "Is MountService running?");
+            showDialogInner(DLG_ERROR_UNMOUNT);
+        }
+        if (stUsers != null && stUsers.length > 0) {
+            if (localLOGV) Log.i(TAG, "Do have storage users accessing "
+                    + extStoragePath);
+            for (int pid : stUsers) {
+                if (localLOGV) Log.i(TAG, pid + " accessing file on sdcard");
+            }
+            // Present dialog to user
+            showDialogInner(DLG_CONFIRM_UNMOUNT);
+        } else {
+            doUnmount(true);
+        }
+}
+
     private void mount() {
         IMountService mountService = getMountService();
         try {
@@ -170,7 +252,6 @@
             }
         } catch (RemoteException ex) {
         }
-        updateMemoryStatus();
     }
 
     private void updateMemoryStatus() {
@@ -233,5 +314,9 @@
     private String formatSize(long size) {
         return Formatter.formatFileSize(this, size);
     }
+
+    public void onCancel(DialogInterface dialog) {
+        finish();
+    }
     
 }
