diff --git a/res/layout/wifi_ap_dialog.xml b/res/layout/wifi_ap_dialog.xml
index a2146c6..002a640 100644
--- a/res/layout/wifi_ap_dialog.xml
+++ b/res/layout/wifi_ap_dialog.xml
@@ -82,7 +82,8 @@
                     android:layout_height="wrap_content"
                     android:singleLine="true"
                     android:password="true"
-                    android:maxLength="63" />
+                    android:maxLength="63"
+                    android:imeOptions="flagForceAscii" />
 
             <TextView android:id="@+id/hint"
                     style="?android:attr/textAppearanceSmall"
diff --git a/src/com/android/settings/applications/ProcStatsEntry.java b/src/com/android/settings/applications/ProcStatsEntry.java
index cbbfbb7..d6311dc 100644
--- a/src/com/android/settings/applications/ProcStatsEntry.java
+++ b/src/com/android/settings/applications/ProcStatsEntry.java
@@ -78,7 +78,6 @@
         mBestTargetPackage = null;
         if (mUnique) {
             mBestTargetPackage = mPackage;
-            addServices(stats.getPackageStateLocked(mPackage, mUid));
         } else {
             // See if there is one significant package that was running here.
             ArrayList<ProcStatsEntry> subProcs = new ArrayList<ProcStatsEntry>();
@@ -90,18 +89,13 @@
                         continue;
                     }
                     ProcessStats.PackageState pkgState = uids.valueAt(iu);
-                    boolean match = false;
                     for (int iproc=0, NPROC=pkgState.mProcesses.size(); iproc<NPROC; iproc++) {
                         ProcessStats.ProcessState subProc =
                                 pkgState.mProcesses.valueAt(iproc);
                         if (subProc.mName.equals(mName)) {
-                            match = true;
                             subProcs.add(new ProcStatsEntry(subProc, totals));
                         }
                     }
-                    if (match) {
-                        addServices(stats.getPackageStateLocked(mPackage, mUid));
-                    }
                 }
             }
             if (subProcs.size() > 1) {
@@ -173,12 +167,8 @@
         }
     }
 
-    public void addServices(ProcessStats.PackageState pkgState) {
-        for (int isvc=0, NSVC=pkgState.mServices.size(); isvc<NSVC; isvc++) {
-            ProcessStats.ServiceState svc = pkgState.mServices.valueAt(isvc);
-            // XXX can't tell what process it is in!
-            mServices.add(new Service(svc));
-        }
+    public void addService(ProcessStats.ServiceState svc) {
+        mServices.add(new Service(svc));
     }
 
     @Override
@@ -213,32 +203,22 @@
     public static final class Service implements Parcelable {
         final String mPackage;
         final String mName;
+        final String mProcess;
         final long mDuration;
 
         public Service(ProcessStats.ServiceState service) {
             mPackage = service.mPackage;
             mName = service.mName;
-            long startDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
-                    ProcessStats.ServiceState.SERVICE_STARTED,
+            mProcess = service.mProcessName;
+            mDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
+                    ProcessStats.ServiceState.SERVICE_RUN,
                     ProcessStats.STATE_NOTHING, 0, 0);
-            long bindDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
-                    ProcessStats.ServiceState.SERVICE_BOUND,
-                    ProcessStats.STATE_NOTHING, 0, 0);
-            long execDuration = ProcessStats.dumpSingleServiceTime(null, null, service,
-                    ProcessStats.ServiceState.SERVICE_EXEC,
-                    ProcessStats.STATE_NOTHING, 0, 0);
-            if (bindDuration > startDuration) {
-                startDuration = bindDuration;
-            }
-            if (execDuration > startDuration) {
-                startDuration = execDuration;
-            }
-            mDuration = startDuration;
         }
 
         public Service(Parcel in) {
             mPackage = in.readString();
             mName = in.readString();
+            mProcess = in.readString();
             mDuration = in.readLong();
         }
 
@@ -251,6 +231,7 @@
         public void writeToParcel(Parcel dest, int flags) {
             dest.writeString(mPackage);
             dest.writeString(mName);
+            dest.writeString(mProcess);
             dest.writeLong(mDuration);
         }
 
diff --git a/src/com/android/settings/applications/ProcessStatsUi.java b/src/com/android/settings/applications/ProcessStatsUi.java
index 49682ed..5c5355d 100644
--- a/src/com/android/settings/applications/ProcessStatsUi.java
+++ b/src/com/android/settings/applications/ProcessStatsUi.java
@@ -30,6 +30,7 @@
 import android.preference.PreferenceFragment;
 import android.preference.PreferenceGroup;
 import android.preference.PreferenceScreen;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.util.SparseArray;
 import android.util.TimeUtils;
@@ -245,10 +246,14 @@
         }
         */
 
+        ArrayMap<String, ProcStatsEntry> processes = new ArrayMap<String, ProcStatsEntry>(
+                mStats.mProcesses.getMap().size());
         for (int ip=0, N=mStats.mProcesses.getMap().size(); ip<N; ip++) {
             SparseArray<ProcessStats.ProcessState> uids = mStats.mProcesses.getMap().valueAt(ip);
             for (int iu=0; iu<uids.size(); iu++) {
-                procs.add(new ProcStatsEntry(uids.valueAt(iu), totals));
+                ProcStatsEntry ent = new ProcStatsEntry(uids.valueAt(iu), totals);
+                procs.add(ent);
+                processes.put(ent.mName, ent);
             }
         }
 
@@ -283,6 +288,21 @@
             mAppListGroup.addPreference(pref);
             if (mAppListGroup.getPreferenceCount() > (MAX_ITEMS_TO_LIST+1)) break;
         }
+
+        // Add in service info.
+        for (int ip=0, N=mStats.mPackages.getMap().size(); ip<N; ip++) {
+            SparseArray<ProcessStats.PackageState> uids = mStats.mPackages.getMap().valueAt(ip);
+            for (int iu=0; iu<uids.size(); iu++) {
+                ProcessStats.PackageState ps = uids.valueAt(iu);
+                for (int is=0, NS=ps.mServices.size(); is<NS; is++) {
+                    ProcessStats.ServiceState ss = ps.mServices.valueAt(is);
+                    if (ss.mProcessName != null) {
+                        ProcStatsEntry ent = processes.get(ss.mProcessName);
+                        ent.addService(ss);
+                    }
+                }
+            }
+        }
     }
 
     private void load() {
diff --git a/src/com/android/settings/fuelgauge/PowerUsageSummary.java b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
index 740fdb5..dc86b8d 100644
--- a/src/com/android/settings/fuelgauge/PowerUsageSummary.java
+++ b/src/com/android/settings/fuelgauge/PowerUsageSummary.java
@@ -249,7 +249,10 @@
                     }
                     break;
                 case BatteryStatsHelper.MSG_REPORT_FULLY_DRAWN:
-                    getActivity().reportFullyDrawn();
+                    Activity activity = getActivity();
+                    if (activity != null) {
+                        activity.reportFullyDrawn();
+                    }
                     break;
             }
             super.handleMessage(msg);
diff --git a/src/com/android/settings/location/DimmableIconPreference.java b/src/com/android/settings/location/DimmableIconPreference.java
deleted file mode 100644
index bc75fc4..0000000
--- a/src/com/android/settings/location/DimmableIconPreference.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Copyright (C) 2013 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.location;
-
-import android.content.Context;
-import android.graphics.drawable.Drawable;
-import android.preference.Preference;
-import android.util.AttributeSet;
-
-/**
- * A preference item that can dim the icon when it's disabled.
- */
-public class DimmableIconPreference extends Preference {
-    private static final int ICON_ALPHA_ENABLED = 255;
-    private static final int ICON_ALPHA_DISABLED = 102;
-
-    public DimmableIconPreference(Context context, AttributeSet attrs, int defStyle) {
-        super(context, attrs, defStyle);
-    }
-
-    public DimmableIconPreference(Context context, AttributeSet attrs) {
-        super(context, attrs);
-    }
-
-    public DimmableIconPreference(Context context) {
-        super(context);
-    }
-
-    @Override
-    public void onParentChanged(Preference parent, boolean disableChild) {
-        Drawable icon = getIcon();
-        if (icon != null) {
-            icon.setAlpha(disableChild ? ICON_ALPHA_DISABLED : ICON_ALPHA_ENABLED);
-            setIcon(icon);
-        }
-        super.onParentChanged(parent, disableChild);
-    }
-}
diff --git a/src/com/android/settings/location/RecentLocationApps.java b/src/com/android/settings/location/RecentLocationApps.java
index 84178e8..1fa8aac 100644
--- a/src/com/android/settings/location/RecentLocationApps.java
+++ b/src/com/android/settings/location/RecentLocationApps.java
@@ -96,7 +96,7 @@
             CharSequence label,
             boolean isHighBattery,
             Preference.OnPreferenceClickListener listener) {
-        Preference pref = new DimmableIconPreference(mActivity);
+        Preference pref = new Preference(mActivity);
         pref.setIcon(icon);
         pref.setTitle(label);
         if (isHighBattery) {
diff --git a/src/com/android/settings/location/SettingsInjector.java b/src/com/android/settings/location/SettingsInjector.java
index 12bf38f..b919080 100644
--- a/src/com/android/settings/location/SettingsInjector.java
+++ b/src/com/android/settings/location/SettingsInjector.java
@@ -312,7 +312,8 @@
                     mSettingsBeingLoaded.remove(timedOutSetting);
                     mTimedOutSettings.add(timedOutSetting);
                     if (Log.isLoggable(TAG, Log.WARN)) {
-                        Log.w(TAG, "Timed out trying to get status for: " + timedOutSetting);
+                        Log.w(TAG, "Timed out after " + timedOutSetting.getElapsedTime()
+                                + " millis trying to get status for: " + timedOutSetting);
                     }
                     break;
                 default:
@@ -447,13 +448,21 @@
             } else {
                 startMillis = 0;
             }
-            mContext.startService(intent);
+
+            // Start the service, making sure that this is attributed to the current user rather
+            // than the system user.
+            mContext.startServiceAsUser(intent, android.os.Process.myUserHandle());
+        }
+
+        public long getElapsedTime() {
+            long end = SystemClock.elapsedRealtime();
+            return end - startMillis;
         }
 
         public void maybeLogElapsedTime() {
             if (Log.isLoggable(TAG, Log.DEBUG) && startMillis != 0) {
-                long end = SystemClock.elapsedRealtime();
-                Log.d(TAG, this + " update took " + (end - startMillis) + " millis");
+                long elapsed = getElapsedTime();
+                Log.d(TAG, this + " update took " + elapsed + " millis");
             }
         }
     }
