diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 15bb878..1da79f8 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1155,6 +1155,7 @@
         <activity android:name=".CryptKeeper"
                   android:immersive="true"
                   android:launchMode="singleTop"
+                  android:excludeFromRecents="true"
                   android:theme="@android:style/Theme.Holo.NoActionBar"
                   android:configChanges="mcc|mnc|keyboard|keyboardHidden|uiMode"
                   android:windowSoftInputMode="stateVisible|adjustResize">
diff --git a/res/values/strings.xml b/res/values/strings.xml
index ddba657..1428145 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -801,7 +801,7 @@
     <string name="unlock_set_unlock_none_summary">No security</string>
 
     <!-- Title for preference that guides the user through a weak biometric lock [CHAR LIMIT=22] -->
-    <string name="unlock_set_unlock_biometric_weak_title">Face unlock</string>
+    <string name="unlock_set_unlock_biometric_weak_title">Face Unlock</string>
     <!-- Summary for preference that disables unlock security [CHAR LIMIT=45]-->
     <string name="unlock_set_unlock_biometric_weak_summary">Low security, experimental</string>
 
diff --git a/src/com/android/settings/CryptKeeper.java b/src/com/android/settings/CryptKeeper.java
index 8968de4..d58dddb 100644
--- a/src/com/android/settings/CryptKeeper.java
+++ b/src/com/android/settings/CryptKeeper.java
@@ -221,7 +221,20 @@
             // Disable the crypt keeper.
             PackageManager pm = getPackageManager();
             ComponentName name = new ComponentName(this, CryptKeeper.class);
-            pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 0);
+            pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
+                    PackageManager.DONT_KILL_APP);
+            // Typically CryptKeeper is launched as the home app.  We didn't
+            // want to be running, so need to finish this activity and re-launch
+            // its intent now that we are not in the way of doing what is really
+            // supposed to happen.
+            // NOTE: This is really grungy.  I think it would be better for the
+            // activity manager to explicitly launch the crypt keeper instead of
+            // home in the situation where we need to decrypt the device
+            finish();
+            Intent intent = getIntent();
+            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+            intent.setComponent(null);
+            startActivity(intent);
             return;
         }
 
diff --git a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
index df58ec0..cb4058f 100644
--- a/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
+++ b/src/com/android/settings/inputmethod/InputMethodAndSubtypeUtil.java
@@ -317,9 +317,9 @@
                     }
                 }
                 setSubtypesPreferenceEnabled(context, inputMethodInfos, imiId, isEnabled);
-                updateSubtypesPreferenceChecked(context, inputMethodInfos, enabledSubtypes);
             }
         }
+        updateSubtypesPreferenceChecked(context, inputMethodInfos, enabledSubtypes);
     }
 
     public static void setSubtypesPreferenceEnabled(SettingsPreferenceFragment context,
@@ -346,7 +346,8 @@
         PreferenceScreen preferenceScreen = context.getPreferenceScreen();
         for (InputMethodInfo imi : inputMethodProperties) {
             String id = imi.getId();
-            HashSet<String> enabledSubtypesSet = enabledSubtypes.get(id);
+            if (!enabledSubtypes.containsKey(id)) break;
+            final HashSet<String> enabledSubtypesSet = enabledSubtypes.get(id);
             final int subtypeCount = imi.getSubtypeCount();
             for (int i = 0; i < subtypeCount; ++i) {
                 InputMethodSubtype subtype = imi.getSubtypeAt(i);
diff --git a/src/com/android/settings/inputmethod/InputMethodPreference.java b/src/com/android/settings/inputmethod/InputMethodPreference.java
index f222b88..4ecdb8e 100644
--- a/src/com/android/settings/inputmethod/InputMethodPreference.java
+++ b/src/com/android/settings/inputmethod/InputMethodPreference.java
@@ -226,6 +226,7 @@
     public void setChecked(boolean checked) {
         super.setChecked(checked);
         saveImeSettings();
+        updateSummary();
     }
 
     private void showSecurityWarnDialog(InputMethodInfo imi, final CheckBoxPreference chkPref) {
diff --git a/src/com/android/settings/widget/ChartNetworkSeriesView.java b/src/com/android/settings/widget/ChartNetworkSeriesView.java
index c4f45b0..7a4617b 100644
--- a/src/com/android/settings/widget/ChartNetworkSeriesView.java
+++ b/src/com/android/settings/widget/ChartNetworkSeriesView.java
@@ -181,10 +181,13 @@
         final int height = getHeight();
 
         boolean started = false;
-        float firstX = 0;
         float lastX = 0;
-        float lastY = 0;
-        long lastTime = Long.MIN_VALUE;
+        float lastY = height;
+        long lastTime = mHoriz.convertToValue(lastX);
+
+        // move into starting position
+        mPathStroke.moveTo(lastX, lastY);
+        mPathFill.moveTo(lastX, lastY);
 
         // TODO: count fractional data from first bucket crossing start;
         // currently it only accepts first full bucket.
@@ -198,36 +201,42 @@
         for (int i = start; i <= end; i++) {
             entry = mStats.getValues(i, entry);
 
-            lastTime = entry.bucketStart + entry.bucketDuration;
-            final float x = mHoriz.convertToPoint(lastTime);
-            final float y = mVert.convertToPoint(totalData);
+            final long startTime = entry.bucketStart;
+            final long endTime = startTime + entry.bucketDuration;
+
+            final float startX = mHoriz.convertToPoint(startTime);
+            final float endX = mHoriz.convertToPoint(endTime);
 
             // skip until we find first stats on screen
-            if (i > 0 && !started && x > 0) {
-                mPathStroke.moveTo(lastX, lastY);
-                mPathFill.moveTo(lastX, lastY);
-                started = true;
-                firstX = x;
+            if (endX < 0) continue;
+
+            // increment by current bucket total
+            totalData += entry.rxBytes + entry.txBytes;
+
+            final float startY = lastY;
+            final float endY = mVert.convertToPoint(totalData);
+
+            if (lastTime != startTime) {
+                // gap in buckets; line to start of current bucket
+                mPathStroke.lineTo(startX, startY);
+                mPathFill.lineTo(startX, startY);
             }
 
-            if (started) {
-                mPathStroke.lineTo(x, y);
-                mPathFill.lineTo(x, y);
-                totalData += entry.rxBytes + entry.txBytes;
-            }
+            // always draw to end of current bucket
+            mPathStroke.lineTo(endX, endY);
+            mPathFill.lineTo(endX, endY);
 
-            lastX = x;
-            lastY = y;
+            lastX = endX;
+            lastY = endY;
+            lastTime = endTime;
         }
 
         // when data falls short, extend to requested end time
         if (lastTime < mEndTime) {
             lastX = mHoriz.convertToPoint(mEndTime);
 
-            if (started) {
-                mPathStroke.lineTo(lastX, lastY);
-                mPathFill.lineTo(lastX, lastY);
-            }
+            mPathStroke.lineTo(lastX, lastY);
+            mPathFill.lineTo(lastX, lastY);
         }
 
         if (LOGD) {
@@ -239,7 +248,7 @@
 
         // drop to bottom of graph from current location
         mPathFill.lineTo(lastX, height);
-        mPathFill.lineTo(firstX, height);
+        mPathFill.lineTo(0, height);
 
         mMax = totalData;
 
