diff --git a/src/com/android/settings/RunningServices.java b/src/com/android/settings/RunningServices.java
index 3340a4b..675c59e 100644
--- a/src/com/android/settings/RunningServices.java
+++ b/src/com/android/settings/RunningServices.java
@@ -22,6 +22,7 @@
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ListActivity;
+import android.app.PendingIntent;
 import android.app.ProgressDialog;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -128,7 +129,7 @@
         PackageItemInfo mPackageInfo;
         CharSequence mDisplayLabel;
         String mLabel;
-        String mName;
+        String mDescription;
         
         int mCurSeq;
         
@@ -141,6 +142,7 @@
     static class ServiceItem extends BaseItem {
         ActivityManager.RunningServiceInfo mRunningService;
         ServiceInfo mServiceInfo;
+        boolean mShownAsStarted;
     }
     
     static class ProcessItem extends BaseItem {
@@ -149,8 +151,10 @@
         int mUid;
         int mPid;
         
-        boolean updateService(PackageManager pm,
+        boolean updateService(Context context,
                 ActivityManager.RunningServiceInfo service) {
+            final PackageManager pm = context.getPackageManager();
+            
             boolean changed = false;
             ServiceItem si = mServices.get(service.service);
             if (si == null) {
@@ -183,6 +187,27 @@
                 si.mActiveSince = activeSince;
                 changed = true;
             }
+            if (service.clientPackage != null && service.clientLabel != 0) {
+                if (si.mShownAsStarted) {
+                    si.mShownAsStarted = false;
+                    changed = true;
+                }
+                try {
+                    Resources clientr = pm.getResourcesForApplication(service.clientPackage);
+                    String label = clientr.getString(service.clientLabel);
+                    si.mDescription = context.getResources().getString(
+                            R.string.service_client_name, label);
+                } catch (PackageManager.NameNotFoundException e) {
+                    si.mDescription = null;
+                }
+            } else {
+                if (!si.mShownAsStarted) {
+                    si.mShownAsStarted = true;
+                    changed = true;
+                }
+                si.mDescription = context.getResources().getString(
+                        R.string.service_started_by_app);
+            }
             
             return changed;
         }
@@ -211,9 +236,10 @@
             final int NS = services.size();
             for (int i=0; i<NS; i++) {
                 ActivityManager.RunningServiceInfo si = services.get(i);
-                // We are not interested in non-started services, because
+                // We are not interested in services that have not been started
+                // and don't have a known client, because
                 // there is nothing the user can do about them.
-                if (!si.started) {
+                if (!si.started && si.clientLabel == 0) {
                     continue;
                 }
                 // We likewise don't care about services running in a
@@ -233,7 +259,7 @@
                     changed = true;
                     proc = new ProcessItem();
                     proc.mIsProcess = true;
-                    proc.mName = si.process;
+                    proc.mDescription = si.process;
                     proc.mUid = si.uid;
                     try {
                         ApplicationInfo ai = pm.getApplicationInfo(si.process, 0);
@@ -275,7 +301,7 @@
                     }
                     proc.mCurSeq = mSequence;
                 }
-                changed |= proc.updateService(context.getPackageManager(), si);
+                changed |= proc.updateService(context, si);
                 
                 if (proc.mLabel == null) {
                     // If we couldn't get information about the overall
@@ -364,7 +390,7 @@
         ImageView separator;
         ImageView icon;
         TextView name;
-        TextView runTime;
+        TextView description;
         TextView size;
     }
     
@@ -418,7 +444,7 @@
             h.separator = (ImageView)v.findViewById(R.id.separator);
             h.icon = (ImageView)v.findViewById(R.id.icon);
             h.name = (TextView)v.findViewById(R.id.name);
-            h.runTime = (TextView)v.findViewById(R.id.run_time);
+            h.description = (TextView)v.findViewById(R.id.description);
             h.size = (TextView)v.findViewById(R.id.size);
             v.setTag(h);
             return v;
@@ -433,18 +459,19 @@
             if (item.mIsProcess) {
                 view.setBackgroundColor(mProcessBgColor);
                 vh.icon.setImageDrawable(item.mPackageInfo.loadIcon(getPackageManager()));
-                vh.runTime.setText(item.mName);
+                vh.description.setText(item.mDescription);
                 vh.size.setText(item.mSizeStr);
                 mActiveItems.remove(view);
             } else {
                 view.setBackgroundDrawable(null);
                 vh.icon.setImageDrawable(null);
-                vh.runTime.setText("");
+                vh.description.setText("");
                 ActiveItem ai = new ActiveItem();
                 ai.mRootView = view;
                 ai.mItem = item;
                 ai.mHolder = vh;
                 ai.mFirstRunTime = item.mActiveSince;
+                vh.description.setText(item.mDescription);
                 ai.updateTime(RunningServices.this);
                 mActiveItems.put(view, ai);
             }
@@ -456,7 +483,14 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MSG_UPDATE_TIMES:
-                    for (ActiveItem ai : mActiveItems.values()) {
+                    Iterator<ActiveItem> it = mActiveItems.values().iterator();
+                    while (it.hasNext()) {
+                        ActiveItem ai = it.next();
+                        if (ai.mRootView.getWindowToken() == null) {
+                            // Clean out any dead views, just in case.
+                            it.remove();
+                            continue;
+                        }
                         ai.updateTime(RunningServices.this);
                     }
                     removeMessages(MSG_UPDATE_TIMES);
@@ -496,14 +530,28 @@
     protected void onListItemClick(ListView l, View v, int position, long id) {
         BaseItem bi = (BaseItem)l.getAdapter().getItem(position);
         if (!bi.mIsProcess) {
-            mCurSelected = bi;
-            AlertDialog.Builder builder = new AlertDialog.Builder(this);
-            builder.setTitle(R.string.confirm_stop_service);
-            builder.setMessage(R.string.confirm_stop_service_msg);
-            builder.setPositiveButton(R.string.confirm_stop_stop, this);
-            builder.setNegativeButton(R.string.confirm_stop_cancel, null);
-            builder.setCancelable(true);
-            mCurDialog = builder.show();
+            ServiceItem si = (ServiceItem)bi;
+            if (si.mRunningService.clientLabel != 0) {
+                mCurSelected = null;
+                PendingIntent pi = mAm.getRunningServiceControlPanel(
+                        si.mRunningService.service);
+                if (pi != null) {
+                    try {
+                        pi.send();
+                    } catch (PendingIntent.CanceledException e) {
+                        // whatever.
+                    }
+                }
+            } else {
+                mCurSelected = bi;
+                AlertDialog.Builder builder = new AlertDialog.Builder(this);
+                builder.setTitle(R.string.confirm_stop_service);
+                builder.setMessage(R.string.confirm_stop_service_msg);
+                builder.setPositiveButton(R.string.confirm_stop_stop, this);
+                builder.setNegativeButton(R.string.confirm_stop_cancel, null);
+                builder.setCancelable(true);
+                mCurDialog = builder.show();
+            }
         } else {
             mCurSelected = null;
         }
diff --git a/src/com/android/settings/SoundAndDisplaySettings.java b/src/com/android/settings/SoundAndDisplaySettings.java
index 4417f24..5f4f358 100644
--- a/src/com/android/settings/SoundAndDisplaySettings.java
+++ b/src/com/android/settings/SoundAndDisplaySettings.java
@@ -73,7 +73,7 @@
     private CheckBoxPreference mVibrate;
     private CheckBoxPreference mDtmfTone;
     private CheckBoxPreference mSoundEffects;
-    private CheckBoxPreference mAnimations;
+    private ListPreference mAnimations;
     private CheckBoxPreference mAccelerometer;
     private float[] mAnimationScales;
     
@@ -118,8 +118,8 @@
         mSoundEffects.setPersistent(false);
         mSoundEffects.setChecked(Settings.System.getInt(resolver,
                 Settings.System.SOUND_EFFECTS_ENABLED, 0) != 0);
-        mAnimations = (CheckBoxPreference) findPreference(KEY_ANIMATIONS);
-        mAnimations.setPersistent(false);
+        mAnimations = (ListPreference) findPreference(KEY_ANIMATIONS);
+        mAnimations.setOnPreferenceChangeListener(this);
         mAccelerometer = (CheckBoxPreference) findPreference(KEY_ACCELEROMETER);
         mAccelerometer.setPersistent(false);
         
@@ -187,29 +187,49 @@
                 R.string.silent_mode_incl_alarm_summary :
                 R.string.silent_mode_summary);
         
-        boolean animations = true;
+        int animations = 0;
         try {
             mAnimationScales = mWindowManager.getAnimationScales();
         } catch (RemoteException e) {
         }
         if (mAnimationScales != null) {
-            // We will leave the window animations alone (always set),
-            // and only use this to change the transition animations.
-            for (int i=1; i<mAnimationScales.length; i++) {
-                if (mAnimationScales[i] == 0) {
-                    animations = false;
-                    break;
-                }
+            if (mAnimationScales.length >= 1) {
+                animations = ((int)(mAnimationScales[0]+.5f)) % 10;
+            }
+            if (mAnimationScales.length >= 2) {
+                animations += (((int)(mAnimationScales[1]+.5f)) & 0x7) * 10;
             }
         }
-        if (animations != mAnimations.isChecked() || force) {
-            mAnimations.setChecked(animations);
+        int idx = 0;
+        int best = 0;
+        CharSequence[] aents = mAnimations.getEntryValues();
+        for (int i=0; i<aents.length; i++) {
+            int val = Integer.parseInt(aents[i].toString());
+            if (val <= animations && val > best) {
+                best = val;
+                idx = i;
+            }
         }
+        mAnimations.setValueIndex(idx);
+        updateAnimationsSummary(mAnimations.getValue());
         mAccelerometer.setChecked(Settings.System.getInt(
                 getContentResolver(), 
                 Settings.System.ACCELEROMETER_ROTATION, 0) != 0);
     }
 
+    private void updateAnimationsSummary(Object value) {
+        CharSequence[] summaries = getResources().getTextArray(R.array.animations_summaries);
+        CharSequence[] values = mAnimations.getEntryValues();
+        for (int i=0; i<values.length; i++) {
+            Log.i("foo", "Comparing entry "+ values[i] + " to current "
+                    + mAnimations.getValue());
+            if (values[i].equals(value)) {
+                mAnimations.setSummary(summaries[i]);
+                break;
+            }
+        }
+    }
+    
     private void setRingerMode(boolean silent, boolean vibrate) {
         if (silent) {
             mAudioManager.setRingerMode(vibrate ? AudioManager.RINGER_MODE_VIBRATE :
@@ -224,7 +244,6 @@
 
     @Override
     public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
-
         if (preference == mSilent || preference == mVibrate) {
             setRingerMode(mSilent.isChecked(), mVibrate.isChecked());
             if (preference == mSilent) updateState(false);
@@ -246,19 +265,6 @@
             Settings.System.putInt(getContentResolver(), Settings.System.SOUND_EFFECTS_ENABLED,
                     mSoundEffects.isChecked() ? 1 : 0);
             
-        } else if (preference == mAnimations) {
-            if (mAnimationScales.length > 0) {
-                // Window animations are always on.
-                mAnimationScales[0] = 1;
-            }
-            for (int i=1; i<mAnimationScales.length; i++) {
-                mAnimationScales[i] = mAnimations.isChecked() ? 1 : 0;
-            }
-            try {
-                mWindowManager.setAnimationScales(mAnimationScales);
-            } catch (RemoteException e) {
-            }
-            
         } else if (preference == mAccelerometer) {
             Settings.System.putInt(getContentResolver(),
                     Settings.System.ACCELEROMETER_ROTATION,
@@ -268,6 +274,25 @@
     }
 
     public boolean onPreferenceChange(Preference preference, Object objValue) {
+        if (KEY_ANIMATIONS.equals(preference.getKey())) {
+            try {
+                int value = Integer.parseInt((String) objValue);
+                if (mAnimationScales.length >= 1) {
+                    mAnimationScales[0] = value%10;
+                }
+                if (mAnimationScales.length >= 2) {
+                    mAnimationScales[1] = (value/10)%10;
+                }
+                try {
+                    mWindowManager.setAnimationScales(mAnimationScales);
+                } catch (RemoteException e) {
+                }
+                updateAnimationsSummary(objValue);
+            } catch (NumberFormatException e) {
+                Log.e(TAG, "could not persist animation setting", e);
+            }
+            
+        }
         if (KEY_SCREEN_TIMEOUT.equals(preference.getKey())) {
             int value = Integer.parseInt((String) objValue);
             try {
