diff --git a/src/com/android/settings/SettingsPreferenceFragment.java b/src/com/android/settings/SettingsPreferenceFragment.java
index 47e31ee..09faf41 100644
--- a/src/com/android/settings/SettingsPreferenceFragment.java
+++ b/src/com/android/settings/SettingsPreferenceFragment.java
@@ -78,6 +78,17 @@
         return getActivity().getPackageManager();
     }
 
+    @Override
+    public void onDetach() {
+        if (isRemoving()) {
+            if (mDialogFragment != null) {
+                mDialogFragment.dismiss();
+                mDialogFragment = null;
+            }
+        }
+        super.onDetach();
+    }
+
     // Dialog management
 
     protected void showDialog(int dialogId) {
diff --git a/src/com/android/settings/applications/ManageApplications.java b/src/com/android/settings/applications/ManageApplications.java
index 37efefc..e0233be 100644
--- a/src/com/android/settings/applications/ManageApplications.java
+++ b/src/com/android/settings/applications/ManageApplications.java
@@ -184,6 +184,8 @@
     static final String TAB_SDCARD = "OnSdCard";
     private View mRootView;
 
+    private boolean mShowBackground = false;
+    
     // -------------- Copied from TabActivity --------------
 
     private TabHost mTabHost;
@@ -539,6 +541,7 @@
             mFilterApps = savedInstanceState.getInt("filterApps", mFilterApps);
             String tmp = savedInstanceState.getString("defaultTabTag");
             if (tmp != null) defaultTabTag = tmp;
+            mShowBackground = savedInstanceState.getBoolean("showBackground", false);
         }
         
         mDefaultTab = defaultTabTag;
@@ -631,6 +634,7 @@
         if (mDefaultTab != null) {
             outState.putString("defautTabTag", mDefaultTab);
         }
+        outState.putBoolean("showBackground", mShowBackground);
     }
 
     @Override
@@ -666,11 +670,13 @@
     public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
         Log.i(TAG, "onCreateOptionsMenu in " + this + ": " + menu);
         mOptionsMenu = menu;
+        // note: icons removed for now because the cause the new action
+        // bar UI to be very confusing.
         menu.add(0, SORT_ORDER_ALPHA, 1, R.string.sort_order_alpha)
-                .setIcon(android.R.drawable.ic_menu_sort_alphabetically)
+                //.setIcon(android.R.drawable.ic_menu_sort_alphabetically)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
         menu.add(0, SORT_ORDER_SIZE, 2, R.string.sort_order_size)
-                .setIcon(android.R.drawable.ic_menu_sort_by_size)
+                //.setIcon(android.R.drawable.ic_menu_sort_by_size)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
         menu.add(0, SHOW_RUNNING_SERVICES, 3, R.string.show_running_services)
                 .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
@@ -722,8 +728,10 @@
                 mApplicationsAdapter.rebuild(mFilterApps, mSortOrder);
             }
         } else if (menuId == SHOW_RUNNING_SERVICES) {
+            mShowBackground = false;
             mRunningProcessesView.mAdapter.setShowBackground(false);
         } else if (menuId == SHOW_BACKGROUND_PROCESSES) {
+            mShowBackground = true;
             mRunningProcessesView.mAdapter.setShowBackground(true);
         }
         updateOptionsMenu();
@@ -838,6 +846,7 @@
         } else if (which == VIEW_RUNNING) {
             if (!mCreatedRunning) {
                 mRunningProcessesView.doCreate(null);
+                mRunningProcessesView.mAdapter.setShowBackground(mShowBackground);
                 mCreatedRunning = true;
             }
             boolean haveData = true;
diff --git a/src/com/android/settings/applications/RunningProcessesView.java b/src/com/android/settings/applications/RunningProcessesView.java
index ef5adac..1f91c33 100644
--- a/src/com/android/settings/applications/RunningProcessesView.java
+++ b/src/com/android/settings/applications/RunningProcessesView.java
@@ -431,15 +431,17 @@
 
     // utility method used to start sub activity
     private void startServiceDetailsActivity(RunningState.MergedItem mi) {
-        // start new fragment to display extended information
-        Bundle args = new Bundle();
-        args.putInt(RunningServiceDetails.KEY_UID, mi.mProcess.mUid);
-        args.putString(RunningServiceDetails.KEY_PROCESS, mi.mProcess.mProcessName);
-        args.putBoolean(RunningServiceDetails.KEY_BACKGROUND, mAdapter.mShowBackground);
-
-        PreferenceActivity pa = (PreferenceActivity)mOwner.getActivity();
-        pa.startPreferencePanel(RunningServiceDetails.class.getName(), args,
-                R.string.runningservicedetails_settings_title, null, null, 0);
+        if (mOwner != null) {
+            // start new fragment to display extended information
+            Bundle args = new Bundle();
+            args.putInt(RunningServiceDetails.KEY_UID, mi.mProcess.mUid);
+            args.putString(RunningServiceDetails.KEY_PROCESS, mi.mProcess.mProcessName);
+            args.putBoolean(RunningServiceDetails.KEY_BACKGROUND, mAdapter.mShowBackground);
+    
+            PreferenceActivity pa = (PreferenceActivity)mOwner.getActivity();
+            pa.startPreferencePanel(RunningServiceDetails.class.getName(), args,
+                    R.string.runningservicedetails_settings_title, null, null, 0);
+        }
     }
     
     public void onMovedToScrapHeap(View view) {
