Merge changes I87f551a7,Icb8dc76c,I66fbf585,I0c9506e7 into lmp-dev

* changes:
  Add context to MediaController constructor
  Add getPackageName to MediaController
  Expose a way to set a PendingIntent for restarting playback
  Finish plumbing for launch intents in sessions
diff --git a/Android.mk b/Android.mk
index 30cb9c6..4376ed6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -215,7 +215,6 @@
 	core/java/android/print/IWriteResultCallback.aidl \
 	core/java/android/printservice/IPrintService.aidl \
 	core/java/android/printservice/IPrintServiceClient.aidl \
-	core/java/android/service/dreams/IDozeHardware.aidl \
 	core/java/android/service/dreams/IDreamManager.aidl \
 	core/java/android/service/dreams/IDreamService.aidl \
 	core/java/android/service/persistentdata/IPersistentDataBlockService.aidl \
diff --git a/api/current.txt b/api/current.txt
index 2fbe9be..b39f200 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -564,9 +564,9 @@
     field public static final int fastScrollTextColor = 16843609; // 0x1010359
     field public static final int fastScrollThumbDrawable = 16843574; // 0x1010336
     field public static final int fastScrollTrackDrawable = 16843577; // 0x1010339
-    field public static final int fill = 16843807; // 0x101041f
     field public static final int fillAfter = 16843197; // 0x10101bd
     field public static final int fillBefore = 16843196; // 0x10101bc
+    field public static final int fillColor = 16843807; // 0x101041f
     field public static final int fillEnabled = 16843343; // 0x101024f
     field public static final int fillOpacity = 16843806; // 0x101041e
     field public static final int fillViewport = 16843130; // 0x101017a
@@ -1161,7 +1161,7 @@
     field public static final int streamType = 16843273; // 0x1010209
     field public static final int stretchColumns = 16843081; // 0x1010149
     field public static final int stretchMode = 16843030; // 0x1010116
-    field public static final int stroke = 16843809; // 0x1010421
+    field public static final int strokeColor = 16843809; // 0x1010421
     field public static final int strokeLineCap = 16843815; // 0x1010427
     field public static final int strokeLineJoin = 16843816; // 0x1010428
     field public static final int strokeOpacity = 16843810; // 0x1010422
@@ -1388,6 +1388,7 @@
     field public static final int windowAllowExitTransitionOverlap = 16843837; // 0x101043d
     field public static final int windowAnimationStyle = 16842926; // 0x10100ae
     field public static final int windowBackground = 16842836; // 0x1010054
+    field public static final int windowClipToOutline = 16843953; // 0x10104b1
     field public static final int windowCloseOnTouchOutside = 16843611; // 0x101035b
     field public static final int windowContentOverlay = 16842841; // 0x1010059
     field public static final int windowContentTransitionManager = 16843795; // 0x1010413
@@ -5415,6 +5416,7 @@
     field public static final java.lang.String EXTRA_DEVICE_ADMIN = "android.app.extra.DEVICE_ADMIN";
     field public static final java.lang.String EXTRA_PROVISIONING_DEFAULT_MANAGED_PROFILE_NAME = "android.app.extra.defaultManagedProfileName";
     field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM = "android.app.extra.deviceAdminPackageChecksum";
+    field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER = "android.app.extra.deviceAdminPackageDownloadCookieHeader";
     field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION = "android.app.extra.deviceAdminPackageDownloadLocation";
     field public static final java.lang.String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME = "android.app.extra.deviceAdminPackageName";
     field public static final java.lang.String EXTRA_PROVISIONING_EMAIL_ADDRESS = "android.app.extra.ManagedProfileEmailAddress";
@@ -14371,6 +14373,11 @@
     field public static final int QUALITY_720P = 5; // 0x5
     field public static final int QUALITY_CIF = 3; // 0x3
     field public static final int QUALITY_HIGH = 1; // 0x1
+    field public static final int QUALITY_HIGH_SPEED_1080P = 2004; // 0x7d4
+    field public static final int QUALITY_HIGH_SPEED_480P = 2002; // 0x7d2
+    field public static final int QUALITY_HIGH_SPEED_720P = 2003; // 0x7d3
+    field public static final int QUALITY_HIGH_SPEED_HIGH = 2001; // 0x7d1
+    field public static final int QUALITY_HIGH_SPEED_LOW = 2000; // 0x7d0
     field public static final int QUALITY_LOW = 0; // 0x0
     field public static final int QUALITY_QCIF = 2; // 0x2
     field public static final int QUALITY_QVGA = 7; // 0x7
@@ -17015,12 +17022,12 @@
 
   public abstract class TvInputService.Session implements android.view.KeyEvent.Callback {
     ctor public TvInputService.Session();
-    method public void dispatchChannelRetuned(android.net.Uri);
-    method public void dispatchContentAllowed();
-    method public void dispatchContentBlocked(android.media.tv.TvContentRating);
-    method public void dispatchTrackInfoChanged(java.util.List<android.media.tv.TvTrackInfo>);
-    method public void dispatchVideoAvailable();
-    method public void dispatchVideoUnavailable(int);
+    method public void notifyChannelRetuned(android.net.Uri);
+    method public void notifyContentAllowed();
+    method public void notifyContentBlocked(android.media.tv.TvContentRating);
+    method public void notifyTrackInfoChanged(java.util.List<android.media.tv.TvTrackInfo>);
+    method public void notifyVideoAvailable();
+    method public void notifyVideoUnavailable(int);
     method public android.view.View onCreateOverlayView();
     method public boolean onGenericMotionEvent(android.view.MotionEvent);
     method public boolean onKeyDown(int, android.view.KeyEvent);
@@ -17028,7 +17035,6 @@
     method public boolean onKeyMultiple(int, int, android.view.KeyEvent);
     method public boolean onKeyUp(int, android.view.KeyEvent);
     method public abstract void onRelease();
-    method public void onRequestUnblockContent(android.media.tv.TvContentRating);
     method public boolean onSelectTrack(android.media.tv.TvTrackInfo);
     method public abstract void onSetCaptionEnabled(boolean);
     method public abstract void onSetStreamVolume(float);
@@ -17037,6 +17043,7 @@
     method public boolean onTouchEvent(android.view.MotionEvent);
     method public boolean onTrackballEvent(android.view.MotionEvent);
     method public abstract boolean onTune(android.net.Uri);
+    method public void onUnblockContent(android.media.tv.TvContentRating);
     method public boolean onUnselectTrack(android.media.tv.TvTrackInfo);
     method public void setOverlayViewEnabled(boolean);
   }
@@ -17438,6 +17445,7 @@
   public class Network implements android.os.Parcelable {
     method public int describeContents();
     method public java.net.InetAddress[] getAllByName(java.lang.String) throws java.net.UnknownHostException;
+    method public java.net.URL getBoundURL(java.net.URL) throws java.net.MalformedURLException;
     method public java.net.InetAddress getByName(java.lang.String) throws java.net.UnknownHostException;
     method public javax.net.SocketFactory getSocketFactory();
     method public void writeToParcel(android.os.Parcel, int);
@@ -25541,11 +25549,13 @@
     field public static final java.lang.String ACTION_SOUND_SETTINGS = "android.settings.SOUND_SETTINGS";
     field public static final java.lang.String ACTION_SYNC_SETTINGS = "android.settings.SYNC_SETTINGS";
     field public static final java.lang.String ACTION_USER_DICTIONARY_SETTINGS = "android.settings.USER_DICTIONARY_SETTINGS";
+    field public static final java.lang.String ACTION_VOICE_CONTROL_AIRPLANE_MODE = "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
     field public static final java.lang.String ACTION_WIFI_IP_SETTINGS = "android.settings.WIFI_IP_SETTINGS";
     field public static final java.lang.String ACTION_WIFI_SETTINGS = "android.settings.WIFI_SETTINGS";
     field public static final java.lang.String ACTION_WIRELESS_SETTINGS = "android.settings.WIRELESS_SETTINGS";
     field public static final java.lang.String AUTHORITY = "settings";
     field public static final java.lang.String EXTRA_ACCOUNT_TYPES = "account_types";
+    field public static final java.lang.String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
     field public static final java.lang.String EXTRA_AUTHORITIES = "authorities";
     field public static final java.lang.String EXTRA_INPUT_METHOD_ID = "input_method_id";
   }
@@ -28610,7 +28620,7 @@
     method public final android.telecomm.Connection getParentConnection();
     method public final int getState();
     method public final android.telecomm.StatusHints getStatusHints();
-    method public final android.telecomm.VideoCallProvider getVideoCallProvider();
+    method public final android.telecomm.ConnectionService.VideoCallProvider getVideoCallProvider();
     method public final int getVideoState();
     method public final boolean isConferenceConnection();
     method public final boolean isRequestingRingback();
@@ -28647,7 +28657,7 @@
     method public final void setRinging();
     method public final void setSignal(android.os.Bundle);
     method public final void setStatusHints(android.telecomm.StatusHints);
-    method public final void setVideoCallProvider(android.telecomm.VideoCallProvider);
+    method public final void setVideoCallProvider(android.telecomm.ConnectionService.VideoCallProvider);
     method public final void setVideoState(int);
     method public final void startActivityFromInCall(android.app.PendingIntent);
     method public static java.lang.String stateToString(int);
@@ -28699,6 +28709,26 @@
     method public abstract void onSuccess(android.telecomm.ConnectionRequest, CONNECTION);
   }
 
+  public static abstract class ConnectionService.VideoCallProvider {
+    ctor public ConnectionService.VideoCallProvider();
+    method public void changeCallDataUsage(int);
+    method public void changeCameraCapabilities(android.telecomm.CallCameraCapabilities);
+    method public void changePeerDimensions(int, int);
+    method public void handleCallSessionEvent(int);
+    method public abstract void onRequestCallDataUsage();
+    method public abstract void onRequestCameraCapabilities();
+    method public abstract void onSendSessionModifyRequest(android.telecomm.VideoCallProfile);
+    method public abstract void onSendSessionModifyResponse(android.telecomm.VideoCallProfile);
+    method public abstract void onSetCamera(java.lang.String);
+    method public abstract void onSetDeviceOrientation(int);
+    method public abstract void onSetDisplaySurface(android.view.Surface);
+    method public abstract void onSetPauseImage(java.lang.String);
+    method public abstract void onSetPreviewSurface(android.view.Surface);
+    method public abstract void onSetZoom(float);
+    method public void receiveSessionModifyRequest(android.telecomm.VideoCallProfile);
+    method public void receiveSessionModifyResponse(int, android.telecomm.VideoCallProfile, android.telecomm.VideoCallProfile);
+  }
+
   public class GatewayInfo implements android.os.Parcelable {
     method public int describeContents();
     method public android.net.Uri getGatewayHandle();
@@ -28931,26 +28961,6 @@
     field public static final int VIDEO_STATE_TX_ENABLED = 1; // 0x1
   }
 
-  public abstract class VideoCallProvider {
-    ctor public VideoCallProvider();
-    method public void changeCallDataUsage(int);
-    method public void changeCameraCapabilities(android.telecomm.CallCameraCapabilities);
-    method public void changePeerDimensions(int, int);
-    method public void handleCallSessionEvent(int);
-    method public abstract void onRequestCallDataUsage();
-    method public abstract void onRequestCameraCapabilities();
-    method public abstract void onSendSessionModifyRequest(android.telecomm.VideoCallProfile);
-    method public abstract void onSendSessionModifyResponse(android.telecomm.VideoCallProfile);
-    method public abstract void onSetCamera(java.lang.String);
-    method public abstract void onSetDeviceOrientation(int);
-    method public abstract void onSetDisplaySurface(android.view.Surface);
-    method public abstract void onSetPauseImage(java.lang.String);
-    method public abstract void onSetPreviewSurface(android.view.Surface);
-    method public abstract void onSetZoom(float);
-    method public void receiveSessionModifyRequest(android.telecomm.VideoCallProfile);
-    method public void receiveSessionModifyResponse(int, android.telecomm.VideoCallProfile, android.telecomm.VideoCallProfile);
-  }
-
 }
 
 package android.telephony {
@@ -39774,8 +39784,8 @@
     method public void setLogo(android.graphics.drawable.Drawable);
     method public void setLogoDescription(int);
     method public void setLogoDescription(java.lang.CharSequence);
-    method public void setNavigationContentDescription(java.lang.CharSequence);
     method public void setNavigationContentDescription(int);
+    method public void setNavigationContentDescription(java.lang.CharSequence);
     method public void setNavigationIcon(int);
     method public void setNavigationIcon(android.graphics.drawable.Drawable);
     method public void setNavigationOnClickListener(android.view.View.OnClickListener);
diff --git a/core/java/android/accounts/CantAddAccountActivity.java b/core/java/android/accounts/CantAddAccountActivity.java
index 4ac2beb..f7f232e 100644
--- a/core/java/android/accounts/CantAddAccountActivity.java
+++ b/core/java/android/accounts/CantAddAccountActivity.java
@@ -19,7 +19,6 @@
 import android.app.Activity;
 import android.os.Bundle;
 import android.view.View;
-import android.widget.TextView;
 
 import com.android.internal.R;
 
@@ -29,25 +28,11 @@
  */
 public class CantAddAccountActivity extends Activity {
     public static final String EXTRA_ERROR_CODE = "android.accounts.extra.ERROR_CODE";
-    public static final int MISSING = -1;
 
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.app_not_authorized);
-
-        int errorCode = getIntent().getIntExtra(EXTRA_ERROR_CODE, MISSING);
-        if (errorCode != MISSING) {
-            TextView errorText = (TextView) findViewById(R.id.description);
-            switch (errorCode) {
-                case AccountManager.ERROR_CODE_USER_RESTRICTED:
-                    errorText.setText(R.string.app_no_restricted_accounts);
-                    break;
-                default:
-                    // TODO: Get better message. See: http://b/14642886
-                    errorText.setText(R.string.error_message_title);
-            }
-        }
     }
 
     public void onCancelButtonClicked(View view) {
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 68d4cf1..f18507e 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -1583,7 +1583,8 @@
     public void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId, int targetUserId,
             int flags) {
         try {
-            mPM.addCrossProfileIntentFilter(filter, sourceUserId, targetUserId, flags);
+            mPM.addCrossProfileIntentFilter(filter, mContext.getOpPackageName(),
+                    mContext.getUserId(), sourceUserId, targetUserId, flags);
         } catch (RemoteException e) {
             // Should never happen!
         }
@@ -1607,7 +1608,8 @@
     @Override
     public void clearCrossProfileIntentFilters(int sourceUserId) {
         try {
-            mPM.clearCrossProfileIntentFilters(sourceUserId);
+            mPM.clearCrossProfileIntentFilters(sourceUserId, mContext.getOpPackageName(),
+                    mContext.getUserId());
         } catch (RemoteException e) {
             // Should never happen!
         }
@@ -1621,11 +1623,11 @@
             return new BitmapDrawable(getUserManager().getUserIcon(itemInfo.showUserIcon));
         }
         Drawable dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo);
-        if (dr != null) {
-            dr = getUserManager().getBadgedDrawableForUser(dr,
-                    new UserHandle(mContext.getUserId()));
+        if (dr == null) {
+            dr = getDefaultActivityIcon();
         }
-        return dr;
+        return getUserManager().getBadgedDrawableForUser(dr,
+                new UserHandle(mContext.getUserId()));
     }
 
     private static class LegacyPackageInstallObserver extends PackageInstallObserver {
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 1f2f18a..76cf29a 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -273,6 +273,16 @@
         = "android.app.extra.deviceAdminPackageDownloadLocation";
 
     /**
+     * A String extra holding a http cookie header which should be used in the http request to the
+     * url specified in {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}.
+     *
+     * <p>Use in an Nfc record with {@link #PROVISIONING_NFC_MIME_TYPE} that starts device owner
+     * provisioning via an Nfc bump.
+     */
+    public static final String EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER
+        = "android.app.extra.deviceAdminPackageDownloadCookieHeader";
+
+    /**
      * A String extra holding the SHA-1 checksum of the file at download location specified in
      * {@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}. If this doesn't match
      * the file at the download location an error will be shown to the user and the user will be
@@ -302,6 +312,7 @@
      * <ul>
      * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME}</li>
      * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION}</li>
+     * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER}, optional</li>
      * <li>{@link #EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM}</li>
      * <li>{@link #EXTRA_PROVISIONING_LOCAL_TIME} (convert to String), optional</li>
      * <li>{@link #EXTRA_PROVISIONING_TIME_ZONE}, optional</li>
@@ -2391,8 +2402,9 @@
     }
 
     /**
-     * Called by a profile owner to remove the cross-profile intent filters from the managed profile
-     * and from the parent.
+     * Called by a profile owner to remove the cross-profile intent filters that go from the
+     * managed profile to the parent, or from the parent to the managed profile.
+     * Only removes those that have been set by the profile owner.
      * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
      */
     public void clearCrossProfileIntentFilters(ComponentName admin) {
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 27f2011..1fe43ec 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -491,6 +491,7 @@
                         mService.readDescriptor(mClientIf, address,
                             srvcType, srvcInstId, srvcUuid, charInstId, charUuid,
                             descrInstId, descrUuid, AUTHENTICATION_MITM);
+                        return;
                     } catch (RemoteException e) {
                         Log.e(TAG,"",e);
                     }
@@ -544,6 +545,7 @@
                             srvcType, srvcInstId, srvcUuid, charInstId, charUuid,
                             descrInstId, descrUuid, characteristic.getWriteType(),
                             AUTHENTICATION_MITM, descriptor.getValue());
+                        return;
                     } catch (RemoteException e) {
                         Log.e(TAG,"",e);
                     }
diff --git a/core/java/android/bluetooth/le/ScanFilter.java b/core/java/android/bluetooth/le/ScanFilter.java
index 0ae11b0..2ce18b0 100644
--- a/core/java/android/bluetooth/le/ScanFilter.java
+++ b/core/java/android/bluetooth/le/ScanFilter.java
@@ -107,7 +107,7 @@
                 dest.writeParcelable(mServiceUuidMask, flags);
             }
         }
-        dest.writeInt(mServiceDataUuid == null? 0 : 1);
+        dest.writeInt(mServiceDataUuid == null ? 0 : 1);
         if (mServiceDataUuid != null) {
             dest.writeParcelable(mServiceDataUuid, flags);
             dest.writeInt(mServiceData == null ? 0 : mServiceData.length);
@@ -235,6 +235,14 @@
     }
 
     /**
+     * @hide
+     */
+    @Nullable
+    public ParcelUuid getServiceDataUuid() {
+        return mServiceDataUuid;
+    }
+
+    /**
      * Returns the manufacturer id. -1 if the manufacturer filter is not set.
      */
     public int getManufacturerId() {
@@ -287,15 +295,21 @@
         }
 
         // Service data match
-        if (mServiceData != null &&
-                !matchesPartialData(mServiceData, mServiceDataMask, scanRecord.getServiceData())) {
-            return false;
+        if (mServiceData != null) {
+            if (!Objects.equals(mServiceDataUuid, scanRecord.getServiceDataUuid()) ||
+                    !matchesPartialData(mServiceData, mServiceDataMask,
+                            scanRecord.getServiceData())) {
+                return false;
+            }
         }
 
         // Manufacturer data match.
-        if (mManufacturerData != null && !matchesPartialData(mManufacturerData,
-                mManufacturerDataMask, scanRecord.getManufacturerSpecificData())) {
-            return false;
+        if (mManufacturerData != null) {
+            if (mManufacturerId != scanRecord.getManufacturerId() ||
+                    !matchesPartialData(mManufacturerData,
+                            mManufacturerDataMask, scanRecord.getManufacturerSpecificData())) {
+                return false;
+            }
         }
         // All filters match.
         return true;
@@ -353,7 +367,8 @@
     public String toString() {
         return "BluetoothLeScanFilter [mDeviceName=" + mDeviceName + ", mDeviceAddress="
                 + mDeviceAddress
-                + ", mUuid=" + mServiceUuid + ", mUuidMask=" + mServiceUuidMask + ", mServiceData="
+                + ", mUuid=" + mServiceUuid + ", mUuidMask=" + mServiceUuidMask
+                + ", mServiceDataUuid=" + Objects.toString(mServiceDataUuid) + ", mServiceData="
                 + Arrays.toString(mServiceData) + ", mServiceDataMask="
                 + Arrays.toString(mServiceDataMask) + ", mManufacturerId=" + mManufacturerId
                 + ", mManufacturerData=" + Arrays.toString(mManufacturerData)
@@ -363,7 +378,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(mDeviceName, mDeviceAddress, mManufacturerId, mManufacturerData,
-                mManufacturerDataMask, mServiceData, mServiceDataMask,
+                mManufacturerDataMask, mServiceDataUuid, mServiceData, mServiceDataMask,
                 mServiceUuid, mServiceUuidMask);
     }
 
@@ -381,6 +396,7 @@
                         mManufacturerId == other.mManufacturerId &&
                 Objects.deepEquals(mManufacturerData, other.mManufacturerData) &&
                 Objects.deepEquals(mManufacturerDataMask, other.mManufacturerDataMask) &&
+                Objects.deepEquals(mServiceDataUuid, other.mServiceDataUuid) &&
                 Objects.deepEquals(mServiceData, other.mServiceData) &&
                 Objects.deepEquals(mServiceDataMask, other.mServiceDataMask) &&
                 Objects.equals(mServiceUuid, other.mServiceUuid) &&
@@ -498,6 +514,7 @@
                             "size mismatch for service data and service data mask");
                 }
             }
+            mServiceDataUuid = serviceDataUuid;
             mServiceData = serviceData;
             mServiceDataMask = serviceDataMask;
             return this;
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index dd03308..e564c7d 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -225,20 +225,21 @@
                         txPowerLevel = scanRecord[currentPos];
                         break;
                     case DATA_TYPE_SERVICE_DATA:
-                        serviceData = extractBytes(scanRecord, currentPos, dataLength);
-                        // The first two bytes of the service data are service data UUID.
+                        // The first two bytes of the service data are service data UUID in little
+                        // endian. The rest bytes are service data.
                         int serviceUuidLength = BluetoothUuid.UUID_BYTES_16_BIT;
                         byte[] serviceDataUuidBytes = extractBytes(scanRecord, currentPos,
                                 serviceUuidLength);
                         serviceDataUuid = BluetoothUuid.parseUuidFrom(serviceDataUuidBytes);
+                        serviceData = extractBytes(scanRecord, currentPos + 2, dataLength - 2);
                         break;
                     case DATA_TYPE_MANUFACTURER_SPECIFIC_DATA:
-                        manufacturerSpecificData = extractBytes(scanRecord, currentPos,
-                                dataLength);
                         // The first two bytes of the manufacturer specific data are
                         // manufacturer ids in little endian.
-                        manufacturerId = ((manufacturerSpecificData[1] & 0xFF) << 8) +
-                                (manufacturerSpecificData[0] & 0xFF);
+                        manufacturerId = ((scanRecord[currentPos + 1] & 0xFF) << 8) +
+                                (scanRecord[currentPos] & 0xFF);
+                        manufacturerSpecificData = extractBytes(scanRecord, currentPos + 2,
+                                dataLength - 2);
                         break;
                     default:
                         // Just ignore, we don't handle such data type.
diff --git a/core/java/android/bluetooth/le/ScanResult.java b/core/java/android/bluetooth/le/ScanResult.java
index 9aee200..a0bdaff 100644
--- a/core/java/android/bluetooth/le/ScanResult.java
+++ b/core/java/android/bluetooth/le/ScanResult.java
@@ -69,7 +69,7 @@
             dest.writeInt(0);
         }
         if (mScanRecord != null) {
-            dest.writeInt(mScanRecord.getBytes().length);
+            dest.writeInt(1);
             dest.writeByteArray(mScanRecord.getBytes());
         } else {
             dest.writeInt(0);
@@ -145,7 +145,7 @@
     @Override
     public String toString() {
         return "ScanResult{" + "mDevice=" + mDevice + ", mScanRecord="
-                + mScanRecord.toString() + ", mRssi=" + mRssi + ", mTimestampNanos="
+                + Objects.toString(mScanRecord) + ", mRssi=" + mRssi + ", mTimestampNanos="
                 + mTimestampNanos + '}';
     }
 
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 3f9f53b..f224f40 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -1422,12 +1422,12 @@
      * challenge.<p/>
      * This intent is handled by the system at a high priority and applications cannot intercept
      * it.<p/>
-     * You can use {@link KeyguardManager#isKeyguardSecure()} to determine if the user will be
+     * You can use {@link android.app.KeyguardManager#isKeyguardSecure()} to determine if the user will be
      * prompted.
      */
     @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_CONFIRM_DEVICE_CREDENTIAL
-            = "android.intent.action.CONFIRM_DEVICE_CREDENTIAL";
+    public static final String ACTION_CONFIRM_DEVICE_CREDENTIAL = "android.intent.action.CONFIRM_DEVICE_CREDENTIAL";
+
 
     /**
      * Specify whether the package should be uninstalled for all users.
@@ -3182,8 +3182,8 @@
     public static final String EXTRA_TITLE = "android.intent.extra.TITLE";
 
     /**
-     * A CharSequence description to show to the user on the lock screen UI asking for
-     * their credentials when used with {@link #ACTION_CONFIRM_DEVICE_CREDENTIAL}.
+     * A CharSequence description to provide to the user when used with
+     * {@link #ACTION_CONFIRM_DEVICE_CREDENTIAL}.
      */
     public static final String EXTRA_DETAILS = "android.intent.extra.DETAILS";
 
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 72c85ee..7196372 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -244,13 +244,13 @@
 
     void clearPackagePersistentPreferredActivities(String packageName, int userId);
 
-    void addCrossProfileIntentFilter(in IntentFilter intentFilter, int sourceUserId, int targetUserId,
-            int flags);
+    void addCrossProfileIntentFilter(in IntentFilter intentFilter, String ownerPackage,
+            int ownerUserId, int sourceUserId, int targetUserId, int flags);
 
     void addCrossProfileIntentsForPackage(in String packageName, int sourceUserId,
             int targetUserId);
 
-    void clearCrossProfileIntentFilters(int sourceUserId);
+    void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage, int ownerUserId);
 
     /**
      * Report the set of 'Home' activity candidates, plus (if any) which of them
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 9f79a89..4b5bdda 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -152,15 +152,9 @@
      * such as the default activity icon.
      */
     public Drawable loadIcon(PackageManager pm) {
-        if (icon != 0 || showUserIcon != UserHandle.USER_NULL) {
-            Drawable dr = pm.loadItemIcon(this, getApplicationInfo());
-            if (dr != null) {
-                return dr;
-            }
-        }
-        return loadDefaultIcon(pm);
+        return pm.loadItemIcon(this, getApplicationInfo());
     }
-    
+
     /**
      * Retrieve the current graphical banner associated with this item.  This
      * will call back on the given PackageManager to load the banner from
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 62611efa..c5dcd8e 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -205,13 +205,6 @@
     public static final int NO_CROSS_PROFILE = 0x00020000;
 
     /**
-     * Flag for {@link addCrossProfileIntentFilter}: if the cross-profile intent has been set by the
-     * profile owner.
-     * @hide
-     */
-    public static final int SET_BY_PROFILE_OWNER= 0x00000001;
-
-    /**
      * Flag for {@link addCrossProfileIntentFilter}: if this flag is set:
      * when resolving an intent that matches the {@link CrossProfileIntentFilter}, the current
      * profile will be skipped.
@@ -3744,9 +3737,10 @@
      * Adds a {@link CrossProfileIntentFilter}. After calling this method all intents sent from the
      * user with id sourceUserId can also be be resolved by activities in the user with id
      * targetUserId if they match the specified intent filter.
-     * @param filter the {@link IntentFilter} the intent has to match
-     * @param removable if set to false, {@link clearCrossProfileIntentFilters} will not remove this
-     * {@link CrossProfileIntentFilter}
+     * @param filter The {@link IntentFilter} the intent has to match
+     * @param sourceUserId The source user id.
+     * @param targetUserId The target user id.
+     * @param flags The only possible value is {@link SKIP_CURRENT_PROFILE}
      * @hide
      */
     public abstract void addCrossProfileIntentFilter(IntentFilter filter, int sourceUserId,
@@ -3754,8 +3748,8 @@
 
     /**
      * Clearing {@link CrossProfileIntentFilter}s which have the specified user as their
-     * source, and have been set by the profile owner
-     * @param sourceUserId
+     * source, and have been set by the app calling this method.
+     * @param sourceUserId The source user id.
      * @hide
      */
     public abstract void clearCrossProfileIntentFilters(int sourceUserId);
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 9a22d78..97238f1 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -23,11 +23,16 @@
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
 import java.net.Socket;
 import java.net.SocketException;
 import java.net.UnknownHostException;
+import java.net.URL;
 import javax.net.SocketFactory;
 
+import com.android.okhttp.HostResolver;
+import com.android.okhttp.OkHttpClient;
+
 /**
  * Identifies a {@code Network}.  This is supplied to applications via
  * {@link ConnectivityManager.NetworkCallback} in response to the active
@@ -44,7 +49,11 @@
      */
     public final int netId;
 
+    // Objects used to perform per-network operations such as getSocketFactory
+    // and getBoundURL, and a lock to protect access to them.
     private NetworkBoundSocketFactory mNetworkBoundSocketFactory = null;
+    private OkHttpClient mOkHttpClient = null;
+    private Object mLock = new Object();
 
     /**
      * @hide
@@ -166,12 +175,38 @@
      *         {@code Network}.
      */
     public SocketFactory getSocketFactory() {
-        if (mNetworkBoundSocketFactory == null) {
-            mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+        synchronized (mLock) {
+            if (mNetworkBoundSocketFactory == null) {
+                mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+            }
         }
         return mNetworkBoundSocketFactory;
     }
 
+    /**
+     * Returns a {@link URL} based on the given URL but bound to this {@code Network}.
+     * Note that if this {@code Network} ever disconnects, this factory and any URL object it
+     * produced in the past or future will cease to work.
+     *
+     * @return a {@link URL} bound to this {@code Network}.
+     */
+    public URL getBoundURL(URL url) throws MalformedURLException {
+        synchronized (mLock) {
+            if (mOkHttpClient == null) {
+                HostResolver hostResolver = new HostResolver() {
+                    @Override
+                    public InetAddress[] getAllByName(String host) throws UnknownHostException {
+                        return Network.this.getAllByName(host);
+                    }
+                };
+                mOkHttpClient = new OkHttpClient()
+                        .setSocketFactory(getSocketFactory())
+                        .setHostResolver(hostResolver);
+            }
+        }
+        return new URL(url, "", mOkHttpClient.createURLStreamHandler(url.getProtocol()));
+    }
+
     // implement the Parcelable interface
     public int describeContents() {
         return 0;
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 95cb9f3..59cd97c 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -246,6 +246,7 @@
     private static native void nativeRestoreAllowFds(long nativePtr, boolean lastValue);
 
     private static native void nativeWriteByteArray(long nativePtr, byte[] b, int offset, int len);
+    private static native void nativeWriteBlob(long nativePtr, byte[] b, int offset, int len);
     private static native void nativeWriteInt(long nativePtr, int val);
     private static native void nativeWriteLong(long nativePtr, long val);
     private static native void nativeWriteFloat(long nativePtr, float val);
@@ -255,6 +256,7 @@
     private static native void nativeWriteFileDescriptor(long nativePtr, FileDescriptor val);
 
     private static native byte[] nativeCreateByteArray(long nativePtr);
+    private static native byte[] nativeReadBlob(long nativePtr);
     private static native int nativeReadInt(long nativePtr);
     private static native long nativeReadLong(long nativePtr);
     private static native float nativeReadFloat(long nativePtr);
@@ -479,6 +481,16 @@
     }
 
     /**
+     * Write a blob of data into the parcel at the current {@link #dataPosition},
+     * growing {@link #dataCapacity} if needed.
+     * @param b Bytes to place into the parcel.
+     * {@hide}
+     */
+    public final void writeBlob(byte[] b) {
+        nativeWriteBlob(mNativePtr, b, 0, (b != null) ? b.length : 0);
+    }
+
+    /**
      * Write an integer value into the parcel at the current dataPosition(),
      * growing dataCapacity() if needed.
      */
@@ -1700,6 +1712,14 @@
     }
 
     /**
+     * Read a blob of data from the parcel and return it as a byte array.
+     * {@hide}
+     */
+    public final byte[] readBlob() {
+        return nativeReadBlob(mNativePtr);
+    }
+
+    /**
      * Read and return a String[] object from the parcel.
      * {@hide}
      */
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 6a77805..fe201cd 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -131,6 +131,31 @@
             "android.settings.AIRPLANE_MODE_SETTINGS";
 
     /**
+     * Activity Action: Modify Airplane mode settings using the users voice.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
+     * <p>
+     * This intent MUST be started using
+     * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
+     * startVoiceActivity}.
+     * <p>
+     * To tell which state airplane mode should be set to, add the
+     * {@link #EXTRA_AIRPLANE_MODE_ENABLED} extra to this Intent with the state specified.
+     * If there is no extra in this Intent, no changes will be made.
+     * <p>
+     * The activity should verify that
+     * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction} returns true before
+     * modifying the setting.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_VOICE_CONTROL_AIRPLANE_MODE =
+            "android.settings.VOICE_CONTROL_AIRPLANE_MODE";
+
+    /**
      * Activity Action: Show settings for accessibility modules.
      * <p>
      * In some cases, a matching Activity may not exist, so ensure you
@@ -207,7 +232,6 @@
 
     /**
      * Activity Action: Show settings to allow configuration of Wi-Fi.
-
      * <p>
      * In some cases, a matching Activity may not exist, so ensure you
      * safeguard against this.
@@ -780,6 +804,33 @@
     public static final String ACTION_ZEN_MODE_SETTINGS = "android.settings.ZEN_MODE_SETTINGS";
 
     /**
+     * Activity Action: Modify zen mode settings.
+     * <p>
+     * In some cases, a matching Activity may not exist, so ensure you safeguard against this.
+     * <p>
+     * This intent MUST be started using
+     * {@link android.service.voice.VoiceInteractionSession#startVoiceActivity
+     * startVoiceActivity}.
+     * <p>
+     * To tell which state zen mode should be set to, add the
+     * {@link #EXTRA_ZEN_MODE_INTERRUPTION_STATE} extra to this Intent with the state specified.
+     * If there is no extra in this Intent, no changes will be made.
+     * <p>
+     * The Activity should verify that
+     * {@link android.app.Activity#isVoiceInteraction isVoiceInteraction}.
+     * returns true before modifying the setting.
+     * <p>
+     * Input: Nothing.
+     * <p>
+     * Output: Nothing.
+     *
+     * @hide
+     */
+    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+    public static final String ACTION_VOICE_CONTROL_ZEN_MODE =
+            "android.settings.VOICE_CONTROL_ZEN_MODE";
+
+    /**
      * Activity Action: Show the regulatory information screen for the device.
      * <p>
      * In some cases, a matching Activity may not exist, so ensure you safeguard
@@ -891,6 +942,27 @@
 
     public static final String EXTRA_INPUT_METHOD_ID = "input_method_id";
 
+    /**
+     * Activity Extra: Enable or disable Airplane Mode.
+     * <p>
+     * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_AIRPLANE_MODE}
+     * intent as a boolean.
+     */
+    public static final String EXTRA_AIRPLANE_MODE_ENABLED = "airplane_mode_enabled";
+
+    /**
+     * Activity Extra: Modify the zen mode interruption state.
+     * <p>
+     * This can be passed as an extra field to the {@link #ACTION_VOICE_CONTROL_ZEN_MODE}
+     * intent as an integer. The value should be one of
+     * {@link android.provider.Settings.Global#ZEN_MODE_OFF},
+     * {@link android.provider.Settings.Global#ZEN_MODE_IMPORTANT_INTERRUPTIONS},
+     * {@link android.provider.Settings.Global#ZEN_MODE_NO_INTERRUPTIONS}.
+     *
+     * @hide
+     */
+    public static final String EXTRA_ZEN_MODE_INTERRUPTION_STATE = "zen_mode_interruption_state";
+
     private static final String JID_RESOURCE_PREFIX = "android";
 
     public static final String AUTHORITY = "settings";
@@ -4846,6 +4918,14 @@
         public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/global");
 
         /**
+         * Whether users are allowed to add more users or guest from lockscreen.
+         * <p>
+         * Type: int
+         * @hide
+         */
+        public static final String ADD_USERS_WHEN_LOCKED = "add_users_when_locked";
+
+        /**
          * Setting whether the global gesture for enabling accessibility is enabled.
          * If this gesture is enabled the user will be able to perfrom it to enable
          * the accessibility state without visiting the settings app.
diff --git a/core/java/android/service/dreams/DozeHardware.java b/core/java/android/service/dreams/DozeHardware.java
deleted file mode 100644
index b5e7f43..0000000
--- a/core/java/android/service/dreams/DozeHardware.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright (C) 2014 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 android.service.dreams;
-
-import android.os.RemoteException;
-import android.util.Log;
-
-/**
- * Provides access to low-level hardware features that a dream may use to provide
- * a richer user experience while dozing.
- * <p>
- * This class contains functions that should be called by the dream to configure
- * hardware before starting to doze and allowing the application processor to suspend.
- * For example, the dream may provide the hardware with enough information to render
- * some content on its own without any further assistance from the application processor.
- * </p><p>
- * This object is obtained by calling {@link DreamService#getDozeHardware()}.
- * </p>
- *
- * @hide experimental
- */
-public final class DozeHardware {
-    private static final String TAG = "DozeHardware";
-
-    public static final String MSG_ENABLE_MCU = "enable_mcu";
-
-    public static final byte[] VALUE_ON = "on".getBytes();
-    public static final byte[] VALUE_OFF = "off".getBytes();
-
-    private final IDozeHardware mHardware;
-
-    DozeHardware(IDozeHardware hardware) {
-        mHardware = hardware;
-    }
-
-    /**
-     * Sets whether to enable the microcontroller.
-     *
-     * @param enable If true, enables the MCU otherwise disables it.
-     */
-    public void setEnableMcu(boolean enable) {
-        sendMessage(MSG_ENABLE_MCU, enable ? VALUE_ON : VALUE_OFF);
-    }
-
-    /**
-     * Sends a message to the doze hardware module.
-     *
-     * @param msg The name of the message to send.
-     * @param arg An optional argument data blob, may be null.
-     * @return A result data blob, may be null.
-     */
-    public byte[] sendMessage(String msg, byte[] arg) {
-        if (msg == null) {
-            throw new IllegalArgumentException("msg must not be null");
-        }
-
-        try {
-            return mHardware.sendMessage(msg, arg);
-        } catch (RemoteException ex) {
-            Log.e(TAG, "Failed to send message to doze hardware module.", ex);
-            return null;
-        }
-    }
-}
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 5cf8aa6..7e04ae8 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -183,7 +183,6 @@
     private boolean mCanDoze;
     private boolean mDozing;
     private boolean mWindowless;
-    private DozeHardware mDozeHardware;
     private int mDozeScreenState = Display.STATE_UNKNOWN;
     private int mDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
 
@@ -658,29 +657,6 @@
     }
 
     /**
-     * Gets an object that may be used to access low-level hardware features that a
-     * dream may use to provide a richer user experience while dozing.
-     *
-     * @return An instance of {@link DozeHardware} or null if this device does not offer
-     * hardware support for dozing.
-     *
-     * @hide For use by system UI components only.
-     */
-    public DozeHardware getDozeHardware() {
-        if (mCanDoze && mDozeHardware == null && mWindowToken != null) {
-            try {
-                IDozeHardware hardware = mSandman.getDozeHardware(mWindowToken);
-                if (hardware != null) {
-                    mDozeHardware = new DozeHardware(hardware);
-                }
-            } catch (RemoteException ex) {
-                // system server died
-            }
-        }
-        return mDozeHardware;
-    }
-
-    /**
      * Gets the screen state to use while dozing.
      *
      * @return The screen state to use while dozing, such as {@link Display#STATE_ON},
@@ -1084,7 +1060,6 @@
         else if (canDoze()) pw.print(" candoze");
         pw.println();
         if (canDoze()) {
-            pw.println("  doze hardware: " + mDozeHardware);
             pw.println("  doze screen state: " + Display.stateToString(mDozeScreenState));
             pw.println("  doze screen brightness: " + mDozeScreenBrightness);
         }
diff --git a/core/java/android/service/dreams/IDozeHardware.aidl b/core/java/android/service/dreams/IDozeHardware.aidl
deleted file mode 100644
index f5a657b..0000000
--- a/core/java/android/service/dreams/IDozeHardware.aidl
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.service.dreams;
-
-/**
- * @hide
- */
-interface IDozeHardware {
-    byte[] sendMessage(String msg, in byte[] arg);
-}
diff --git a/core/java/android/service/dreams/IDreamManager.aidl b/core/java/android/service/dreams/IDreamManager.aidl
index 648426c..be3f3b3 100644
--- a/core/java/android/service/dreams/IDreamManager.aidl
+++ b/core/java/android/service/dreams/IDreamManager.aidl
@@ -20,7 +20,6 @@
 import android.os.Bundle;
 import android.os.ParcelFileDescriptor;
 import android.os.IBinder;
-import android.service.dreams.IDozeHardware;
 
 /** @hide */
 interface IDreamManager {
@@ -34,5 +33,4 @@
     void finishSelf(in IBinder token, boolean immediate);
     void startDozing(in IBinder token, int screenState, int screenBrightness);
     void stopDozing(in IBinder token);
-    IDozeHardware getDozeHardware(in IBinder token);
 }
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index d685cc5..d077a17 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -133,10 +133,10 @@
     private final Handler mHandler;
 
     /**
-     * The sound model for the keyphrase, derived from the model management service
-     * (IVoiceInteractionManagerService). May be null if the keyphrase isn't enrolled yet.
+     * Indicates if there is a sound model enrolled for the keyphrase,
+     * derived from the model management service (IVoiceInteractionManagerService).
      */
-    private KeyphraseSoundModel mEnrolledSoundModel;
+    private boolean mIsEnrolledForDetection;
     private int mAvailability = STATE_NOT_READY;
 
     /**
@@ -257,7 +257,7 @@
         int code = STATUS_ERROR;
         try {
             code = mModelManagementService.startRecognition(mVoiceInteractionService,
-                    mKeyphraseMetadata.id, mEnrolledSoundModel, mInternalCallback,
+                    mKeyphraseMetadata.id, mInternalCallback,
                     new RecognitionConfig(
                             captureTriggerAudio, recognitionExtra, null /* additional data */));
         } catch (RemoteException e) {
@@ -417,14 +417,13 @@
         @Override
         public Void doInBackground(Void... params) {
             int availability = internalGetInitialAvailability();
-            KeyphraseSoundModel soundModel = null;
+            boolean enrolled = false;
             // Fetch the sound model if the availability is one of the supported ones.
             if (availability == STATE_NOT_READY
                     || availability == STATE_KEYPHRASE_UNENROLLED
                     || availability == STATE_KEYPHRASE_ENROLLED) {
-                soundModel =
-                        internalGetKeyphraseSoundModel(mKeyphraseMetadata.id);
-                if (soundModel == null) {
+                enrolled = internalGetIsEnrolled(mKeyphraseMetadata.id);
+                if (!enrolled) {
                     availability = STATE_KEYPHRASE_UNENROLLED;
                 } else {
                     availability = STATE_KEYPHRASE_ENROLLED;
@@ -436,8 +435,8 @@
                     Slog.d(TAG, "Hotword availability changed from " + mAvailability
                             + " -> " + availability);
                 }
+                mIsEnrolledForDetection = enrolled;
                 mAvailability = availability;
-                mEnrolledSoundModel = soundModel;
                 notifyStateChangedLocked();
             }
             return null;
@@ -475,31 +474,14 @@
         /**
          * @return The corresponding {@link KeyphraseSoundModel} or null if none is found.
          */
-        private KeyphraseSoundModel internalGetKeyphraseSoundModel(int keyphraseId) {
-            List<KeyphraseSoundModel> soundModels;
+        private boolean internalGetIsEnrolled(int keyphraseId) {
             try {
-                soundModels = mModelManagementService
-                        .listRegisteredKeyphraseSoundModels(mVoiceInteractionService);
-                if (soundModels == null || soundModels.isEmpty()) {
-                    Slog.i(TAG, "No available sound models for keyphrase ID: " + keyphraseId);
-                    return null;
-                }
-                for (int i = 0; i < soundModels.size(); i++) {
-                    KeyphraseSoundModel soundModel = soundModels.get(i);
-                    if (soundModel.keyphrases == null || soundModel.keyphrases.length == 0) {
-                        continue;
-                    }
-                    for (int j = 0; i < soundModel.keyphrases.length; j++) {
-                        Keyphrase keyphrase = soundModel.keyphrases[j];
-                        if (keyphrase.id == keyphraseId) {
-                            return soundModel;
-                        }
-                    }
-                }
+                return mModelManagementService.isEnrolledForKeyphrase(
+                        mVoiceInteractionService, keyphraseId);
             } catch (RemoteException e) {
                 Slog.w(TAG, "RemoteException in listRegisteredKeyphraseSoundModels!");
             }
-            return null;
+            return false;
         }
     }
 }
diff --git a/core/java/android/util/PathParser.java b/core/java/android/util/PathParser.java
index c36421d..6820f77 100644
--- a/core/java/android/util/PathParser.java
+++ b/core/java/android/util/PathParser.java
@@ -74,6 +74,9 @@
      * @return a deep copy of the <code>source</code>.
      */
     public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {
+        if (source == null) {
+            return null;
+        }
         PathDataNode[] copy = new PathParser.PathDataNode[source.length];
         for (int i = 0; i < source.length; i ++) {
             copy[i] = new PathDataNode(source[i]);
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index 8aba8af..2d54acb 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -597,6 +597,9 @@
      * @see #getScaleX()
      */
     public boolean setScaleX(float scaleX) {
+        if (scaleX > 1000000) {
+            throw new IllegalArgumentException("Invalid scale: " + scaleX);
+        }
         return nSetScaleX(mNativeRenderNode, scaleX);
     }
 
@@ -618,6 +621,9 @@
      * @see #getScaleY()
      */
     public boolean setScaleY(float scaleY) {
+        if (scaleY > 1000000) {
+            throw new IllegalArgumentException("Invalid scale: " + scaleY);
+        }
         return nSetScaleY(mNativeRenderNode, scaleY);
     }
 
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index c4c3242..27f493a 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3327,7 +3327,7 @@
                     child.mRenderNode.setClipToBounds(clipChildren);
                 }
             }
-            invalidate();
+            invalidate(true);
         }
     }
 
@@ -3342,7 +3342,7 @@
     public void setClipToPadding(boolean clipToPadding) {
         if (hasBooleanFlag(FLAG_CLIP_TO_PADDING) != clipToPadding) {
             setBooleanFlag(FLAG_CLIP_TO_PADDING, clipToPadding);
-            invalidate();
+            invalidate(true);
         }
     }
 
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 2c7b3eb..0401fb7 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -16,6 +16,9 @@
 
 package android.webkit;
 
+import android.app.AppGlobals;
+import android.content.Context;
+import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Process;
 import android.os.RemoteException;
@@ -100,9 +103,14 @@
 
     private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException {
         try {
-            return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY);
-        } catch (ClassNotFoundException e) {
-            Log.e(LOGTAG, "Chromium WebView does not exist");
+            Context webViewContext = AppGlobals.getInitialApplication().createPackageContext(
+                    getWebViewPackageName(),
+                    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
+            ClassLoader clazzLoader = webViewContext.getClassLoader();
+            return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true,
+                                                                 clazzLoader);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(LOGTAG, "Chromium WebView package does not exist");
             return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY);
         }
     }
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 9ff2cf4..a52dd48 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -40,8 +40,6 @@
     int checkAudioOperation(int code, int usage, int uid, String packageName);
     void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages);
 
-    void setDeviceOwner(String packageName);
-    void setProfileOwner(String packageName, int userHandle);
     void setUserRestrictions(in Bundle restrictions, int userHandle);
     void removeUser(int userHandle);
 
diff --git a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
index 7d5abd2..22ec4be 100644
--- a/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
+++ b/core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl
@@ -33,19 +33,24 @@
     void finish(IBinder token);
 
     /**
-     * Lists the registered Sound models for keyphrase detection.
+     * Lists the registered Sound model for keyphrase detection.
      * May be null if no matching sound models exist.
-     *
-     * @param service The current voice interaction service.
      */
-    List<SoundTrigger.KeyphraseSoundModel> listRegisteredKeyphraseSoundModels(
-            in IVoiceInteractionService service);
+    SoundTrigger.KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId);
     /**
      * Updates the given keyphrase sound model. Adds the model if it doesn't exist currently.
      */
     int updateKeyphraseSoundModel(in SoundTrigger.KeyphraseSoundModel model);
+    /**
+     * Deletes the given keyphrase sound model.
+     */
+    int deleteKeyphraseSoundModel(int keyphraseId);
 
     /**
+     * Indicates if there's a keyphrase sound model available for the given keyphrase ID.
+     */
+    boolean isEnrolledForKeyphrase(IVoiceInteractionService service, int keyphraseId);
+    /**
      * Gets the properties of the DSP hardware on this device, null if not present.
      */
     SoundTrigger.ModuleProperties getDspModuleProperties(in IVoiceInteractionService service);
@@ -53,7 +58,7 @@
      * Starts a recognition for the given keyphrase.
      */
     int startRecognition(in IVoiceInteractionService service, int keyphraseId,
-            in SoundTrigger.KeyphraseSoundModel soundModel, in IRecognitionStatusCallback callback,
+            in IRecognitionStatusCallback callback,
             in SoundTrigger.RecognitionConfig recognitionConfig);
     /**
      * Stops a recognition for the given keyphrase.
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 84bd443..969c0db 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -34,6 +34,7 @@
             boolean showImeSwitcher);
     void setHardKeyboardStatus(boolean available, boolean enabled);
     void setWindowState(int window, int state);
+    void buzzBeepBlinked();
 
     void showRecentApps(boolean triggeredFromAltTab);
     void hideRecentApps(boolean triggeredFromAltTab);
diff --git a/core/java/com/android/internal/util/Protocol.java b/core/java/com/android/internal/util/Protocol.java
index af966b1..d9ebc25 100644
--- a/core/java/com/android/internal/util/Protocol.java
+++ b/core/java/com/android/internal/util/Protocol.java
@@ -48,6 +48,8 @@
     public static final int BASE_WIFI_CONTROLLER                                    = 0x00026000;
     public static final int BASE_WIFI_SCANNER                                       = 0x00027000;
     public static final int BASE_WIFI_SCANNER_SERVICE                               = 0x00027100;
+    public static final int BASE_WIFI_RTT_MANAGER                                   = 0x00027200;
+    public static final int BASE_WIFI_RTT_SERVICE                                   = 0x00027300;
     public static final int BASE_WIFI_PASSPOINT_MANAGER                             = 0x00028000;
     public static final int BASE_WIFI_PASSPOINT_SERVICE                             = 0x00028100;
     public static final int BASE_DHCP                                               = 0x00030000;
diff --git a/core/jni/android_hardware_camera2_DngCreator.cpp b/core/jni/android_hardware_camera2_DngCreator.cpp
index 3a3328f..eaadfb2 100644
--- a/core/jni/android_hardware_camera2_DngCreator.cpp
+++ b/core/jni/android_hardware_camera2_DngCreator.cpp
@@ -1173,8 +1173,8 @@
             calibrationTransform1[ctr++] = entry1.data.r[i].denominator;
         }
 
-        BAIL_IF_INVALID(writer->addEntry(TAG_CAMERACALIBRATION1, entry1.count, calibrationTransform1,
-                TIFF_IFD_0), env, TAG_CAMERACALIBRATION1, writer);
+        BAIL_IF_INVALID(writer->addEntry(TAG_CAMERACALIBRATION1, entry1.count,
+                calibrationTransform1, TIFF_IFD_0), env, TAG_CAMERACALIBRATION1, writer);
 
         if (!singleIlluminant) {
             camera_metadata_entry entry2 =
@@ -1188,8 +1188,8 @@
                 calibrationTransform2[ctr++] = entry2.data.r[i].denominator;
             }
 
-            BAIL_IF_INVALID(writer->addEntry(TAG_CAMERACALIBRATION2, entry2.count, calibrationTransform1,
-                    TIFF_IFD_0),  env, TAG_CAMERACALIBRATION2, writer);
+            BAIL_IF_INVALID(writer->addEntry(TAG_CAMERACALIBRATION2, entry2.count,
+                    calibrationTransform1, TIFF_IFD_0),  env, TAG_CAMERACALIBRATION2, writer);
         }
     }
 
@@ -1294,6 +1294,21 @@
     }
 
     {
+        // Setup sensor noise model
+        camera_metadata_entry entry =
+            results.find(ANDROID_SENSOR_NOISE_PROFILE);
+
+        if (entry.count > 0) {
+            BAIL_IF_INVALID(writer->addEntry(TAG_NOISEPROFILE, entry.count,
+                    entry.data.d, TIFF_IFD_0), env,
+                    TAG_NOISEPROFILE, writer);
+        } else {
+            ALOGW("%s: No noise profile found in result metadata.  Image quality may be reduced.",
+                    __FUNCTION__);
+        }
+    }
+
+    {
         // Setup opcode List 2
         camera_metadata_entry entry1 =
                 characteristics.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
diff --git a/core/jni/android_media_AudioTrack.cpp b/core/jni/android_media_AudioTrack.cpp
index 7e2448e..e0431a7 100644
--- a/core/jni/android_media_AudioTrack.cpp
+++ b/core/jni/android_media_AudioTrack.cpp
@@ -290,7 +290,7 @@
     case MODE_STREAM:
 
         status = lpTrack->set(
-                AUDIO_STREAM_DEFAULT,// stream type
+                AUDIO_STREAM_DEFAULT,// stream type, but more info conveyed in paa (last argument)
                 sampleRateInHertz,
                 format,// word length, PCM
                 nativeChannelMask,
@@ -301,7 +301,7 @@
                 0,// shared mem
                 true,// thread can call Java
                 sessionId,// audio session ID
-                AudioTrack::TRANSFER_DEFAULT, // default transfer mode
+                AudioTrack::TRANSFER_SYNC,
                 NULL,                         // default offloadInfo
                 -1, -1,                       // default uid, pid values
                 paa);
@@ -316,7 +316,7 @@
         }
 
         status = lpTrack->set(
-                AUDIO_STREAM_DEFAULT,// stream type
+                AUDIO_STREAM_DEFAULT,// stream type, but more info conveyed in paa (last argument)
                 sampleRateInHertz,
                 format,// word length, PCM
                 nativeChannelMask,
@@ -327,7 +327,7 @@
                 lpJniStorage->mMemBase,// shared mem
                 true,// thread can call Java
                 sessionId,// audio session ID
-                AudioTrack::TRANSFER_DEFAULT, // default transfer mode
+                AudioTrack::TRANSFER_SHARED,
                 NULL,                         // default offloadInfo
                 -1, -1,                       // default uid, pid values
                 paa);
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index 50f6c73..3ba481e 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -187,6 +187,37 @@
     }
 }
 
+static void android_os_Parcel_writeBlob(JNIEnv* env, jclass clazz, jlong nativePtr, jobject data,
+                                        jint offset, jint length) {
+    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
+    if (parcel == NULL) {
+        return;
+    }
+
+    const status_t err = parcel->writeInt32(length);
+    if (err != NO_ERROR) {
+        signalExceptionForError(env, clazz, err);
+        return;
+    }
+
+    android::Parcel::WritableBlob blob;
+    android::status_t err2 = parcel->writeBlob(length, &blob);
+    if (err2 != NO_ERROR) {
+        signalExceptionForError(env, clazz, err2);
+        return;
+    }
+
+    jbyte* ar = (jbyte*)env->GetPrimitiveArrayCritical((jarray)data, 0);
+    if (ar == NULL) {
+        memset(blob.data(), 0, length);
+    } else {
+        memcpy(blob.data(), ar + offset, length);
+        env->ReleasePrimitiveArrayCritical((jarray)data, ar, 0);
+    }
+
+    blob.release();
+}
+
 static void android_os_Parcel_writeInt(JNIEnv* env, jclass clazz, jlong nativePtr, jint val) {
     Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
     const status_t err = parcel->writeInt32(val);
@@ -297,6 +328,36 @@
     return ret;
 }
 
+static jbyteArray android_os_Parcel_readBlob(JNIEnv* env, jclass clazz, jlong nativePtr)
+{
+    jbyteArray ret = NULL;
+
+    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
+    if (parcel != NULL) {
+        int32_t len = parcel->readInt32();
+        if (len >= 0) {
+            android::Parcel::ReadableBlob blob;
+            android::status_t err = parcel->readBlob(len, &blob);
+            if (err != NO_ERROR) {
+                signalExceptionForError(env, clazz, err);
+                return NULL;
+            }
+
+            ret = env->NewByteArray(len);
+            if (ret != NULL) {
+                jbyte* a2 = (jbyte*)env->GetPrimitiveArrayCritical(ret, 0);
+                if (a2) {
+                    memcpy(a2, blob.data(), len);
+                    env->ReleasePrimitiveArrayCritical(ret, a2, 0);
+                }
+            }
+            blob.release();
+        }
+    }
+
+    return ret;
+}
+
 static jint android_os_Parcel_readInt(JNIEnv* env, jclass clazz, jlong nativePtr)
 {
     Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
@@ -634,6 +695,7 @@
     {"nativeRestoreAllowFds",     "(JZ)V", (void*)android_os_Parcel_restoreAllowFds},
 
     {"nativeWriteByteArray",      "(J[BII)V", (void*)android_os_Parcel_writeNative},
+    {"nativeWriteBlob",           "(J[BII)V", (void*)android_os_Parcel_writeBlob},
     {"nativeWriteInt",            "(JI)V", (void*)android_os_Parcel_writeInt},
     {"nativeWriteLong",           "(JJ)V", (void*)android_os_Parcel_writeLong},
     {"nativeWriteFloat",          "(JF)V", (void*)android_os_Parcel_writeFloat},
@@ -643,6 +705,7 @@
     {"nativeWriteFileDescriptor", "(JLjava/io/FileDescriptor;)V", (void*)android_os_Parcel_writeFileDescriptor},
 
     {"nativeCreateByteArray",     "(J)[B", (void*)android_os_Parcel_createByteArray},
+    {"nativeReadBlob",            "(J)[B", (void*)android_os_Parcel_readBlob},
     {"nativeReadInt",             "(J)I", (void*)android_os_Parcel_readInt},
     {"nativeReadLong",            "(J)J", (void*)android_os_Parcel_readLong},
     {"nativeReadFloat",           "(J)F", (void*)android_os_Parcel_readFloat},
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 2043214..6a7501d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -3023,6 +3023,11 @@
                  android:permission="android.permission.BIND_JOB_SERVICE" >
         </service>
 
+        <service android:name="com.android.server.backup.FullBackupJob"
+                 android:exported="true"
+                 android:permission="android.permission.BIND_JOB_SERVICE" >
+        </service>
+
         <service
             android:name="com.android.server.pm.BackgroundDexOptService"
             android:exported="true"
diff --git a/core/res/res/drawable-nodpi/platlogo.xml b/core/res/res/drawable-nodpi/platlogo.xml
index d1e2df3..fb52830 100644
--- a/core/res/res/drawable-nodpi/platlogo.xml
+++ b/core/res/res/drawable-nodpi/platlogo.xml
@@ -13,27 +13,28 @@
     limitations under the License.
 -->
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size android:width="400dp" android:height="400dp"/>
-
-    <viewport android:viewportHeight="25" android:viewportWidth="25" />
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="400dp"
+        android:height="400dp"
+        android:viewportHeight="25"
+        android:viewportWidth="25" >
 
     <path
         android:name="torso"
         android:pathData="m2,2 l21,0 l0,21 l-21,0 z"
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         />
 
     <path
         android:name="|"
         android:pathData="m4,4 l8,0 l0,17 l-8,0 z"
-        android:fill="#FF0000FF"
+        android:fillColor="#FF0000FF"
         />
 
     <path
         android:name="_"
         android:pathData="m5,14 l16,0 l0,6 l-16,0 z"
-        android:fill="#FFFF0000"
+        android:fillColor="#FFFF0000"
         />
 
 </vector>
diff --git a/core/res/res/drawable-nodpi/stat_sys_adb.xml b/core/res/res/drawable-nodpi/stat_sys_adb.xml
index 6b3be4a..1fee2df 100644
--- a/core/res/res/drawable-nodpi/stat_sys_adb.xml
+++ b/core/res/res/drawable-nodpi/stat_sys_adb.xml
@@ -13,10 +13,11 @@
     limitations under the License.
 -->
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size android:width="25dp" android:height="25dp"/>
-
-    <viewport android:viewportHeight="25" android:viewportWidth="25" />
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+        android:width="25dp"
+        android:height="25dp"
+        android:viewportHeight="25"
+        android:viewportWidth="25" >
 
     <path
         android:name="L-card"
@@ -34,7 +35,7 @@
         M15,2 l3,0 l0,5 l5,0 l0,3 l-8,0
 
         z"
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         />
 
 
diff --git a/core/res/res/drawable/ic_audio_ring_notif.xml b/core/res/res/drawable/ic_audio_ring_notif.xml
index b52db5c..60a98ab 100644
--- a/core/res/res/drawable/ic_audio_ring_notif.xml
+++ b/core/res/res/drawable/ic_audio_ring_notif.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#8A000000"
+        android:fillColor="#8A000000"
         android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,16.0l0.0,-5.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0L18.0,16.0z"/>
 </vector>
diff --git a/core/res/res/drawable/ic_audio_ring_notif_mute.xml b/core/res/res/drawable/ic_audio_ring_notif_mute.xml
index 8d7d6cb..17dfa7e 100644
--- a/core/res/res/drawable/ic_audio_ring_notif_mute.xml
+++ b/core/res/res/drawable/ic_audio_ring_notif_mute.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#8A000000"
+        android:fillColor="#8A000000"
         android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,10.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7C9.5,4.3 9.0,4.5 8.6,4.7l9.4,9.4L18.0,10.5zM17.7,19.0l2.0,2.0l1.3,-1.3L4.3,3.0L3.0,4.3l2.9,2.9C5.3,8.2 5.0,9.3 5.0,10.5L5.0,16.0l-2.0,2.0l0.0,1.0L17.7,19.0z" />
 </vector>
diff --git a/core/res/res/drawable/ic_audio_ring_notif_vibrate.xml b/core/res/res/drawable/ic_audio_ring_notif_vibrate.xml
index 2f1d940..2ed33ea 100644
--- a/core/res/res/drawable/ic_audio_ring_notif_vibrate.xml
+++ b/core/res/res/drawable/ic_audio_ring_notif_vibrate.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#8A000000"
+        android:fillColor="#8A000000"
         android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z"/>
 </vector>
diff --git a/core/res/res/drawable/ic_corp_badge.xml b/core/res/res/drawable/ic_corp_badge.xml
index 16c101b..e185fc4 100644
--- a/core/res/res/drawable/ic_corp_badge.xml
+++ b/core/res/res/drawable/ic_corp_badge.xml
@@ -13,31 +13,28 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="20.0dp"
-        android:height="20.0dp"/>
-
-    <viewport
+        android:height="20.0dp"
         android:viewportWidth="20.0"
-        android:viewportHeight="20.0"/>
+        android:viewportHeight="20.0">
 
     <path
         android:pathData="M10.0,10.0m-10.0,0.0a10.0,10.0 0.0,1.0 1.0,20.0 0.0a10.0,10.0 0.0,1.0 1.0,-20.0 0.0"
-        android:fill="#FF5722"/>
+        android:fillColor="#FF5722"/>
     <path
         android:pathData="M11.139,12.149l-0.001,0.0L8.996,12.149l0.0,-0.571L4.738,11.578l-0.002,2.198c0.0,0.589 0.477,1.066 1.066,1.066l8.535,0.0c0.589,0.0 1.066,-0.477 1.066,-1.066l0.0,-2.198l-4.264,0.0L11.139,12.149z"
-        android:fill="#FFFFFF"/>
+        android:fillColor="#FFFFFF"/>
     <path
         android:pathData="M8.996,10.006l2.143,0.0l0.0,0.52l4.442,0.0L15.580999,7.909c0.0,-0.589 -0.477,-1.066 -1.066,-1.066l-1.877,0.0L7.544,6.843L5.606,6.843c-0.589,0.0 -1.061,0.477 -1.061,1.066l-0.003,2.617l4.453,0.0L8.996,10.006L8.996,10.006z"
-        android:fill="#FFFFFF"/>
+        android:fillColor="#FFFFFF"/>
     <path
         android:pathData="M3.367,3.456 h13.016 v13.016 h-13.016z"
-        android:fill="#00000000"/>
+        android:fillColor="#00000000"/>
     <path
         android:pathData="M7.368,5.263l5.263,0.0l0.0,1.053l-5.263,0.0z"
-        android:fill="#FFFFFF"/>
+        android:fillColor="#FFFFFF"/>
     <path
         android:pathData="M8.996,12.149l2.1419992,0.0 0.0010004044,0.0 0.0,-0.5699997 -2.1429996,0.0z"
-        android:fill="#00000000"/>
+        android:fillColor="#00000000"/>
 </vector>
diff --git a/core/res/res/drawable/ic_corp_icon_badge.xml b/core/res/res/drawable/ic_corp_icon_badge.xml
index c8e49e1..d20c431 100644
--- a/core/res/res/drawable/ic_corp_icon_badge.xml
+++ b/core/res/res/drawable/ic_corp_icon_badge.xml
@@ -13,42 +13,39 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64.0dp"
-        android:height="64.0dp"/>
-
-    <viewport
+        android:height="64.0dp"
         android:viewportWidth="64.0"
-        android:viewportHeight="64.0"/>
+        android:viewportHeight="64.0">
 
     <path
-        android:fill="#FF000000"
+        android:fillColor="#FF000000"
         android:pathData="M49.062,50.0m-14.0,0.0a14.0,14.0 0.0,1.0 1.0,28.0 0.0a14.0,14.0 0.0,1.0 1.0,-28.0 0.0"
         android:fillOpacity="0.2"/>
     <path
-        android:fill="#FF000000"
+        android:fillColor="#FF000000"
         android:pathData="M49.0,49.5m-14.0,0.0a14.0,14.0 0.0,1.0 1.0,28.0 0.0a14.0,14.0 0.0,1.0 1.0,-28.0 0.0"
         android:fillOpacity="0.2"/>
     <path
         android:pathData="M49.0,49.0m-14.0,0.0a14.0,14.0 0.0,1.0 1.0,28.0 0.0a14.0,14.0 0.0,1.0 1.0,-28.0 0.0"
-        android:fill="#FF5722"/>
+        android:fillColor="#FF5722"/>
     <path
         android:pathData="M50.594,52.009l-3.0,0.0L47.594,51.0l-5.961,0.0l-0.003,3.289c0.0,0.826 0.668,1.494 1.494,1.494l11.948,0.0c0.826,0.0 1.494,-0.668 1.494,-1.494L56.566006,51.0l-5.972,0.0C50.594,51.0 50.594,52.009 50.594,52.009z"
-        android:fill="#FFFFFF"/>
+        android:fillColor="#FFFFFF"/>
     <path
         android:pathData="M47.594,49.009l3.0,0.0L50.594,50.0l6.22,0.0l0.0,-3.925c0.0,-0.826 -0.668,-1.494 -1.494,-1.494l-2.627,0.0l-7.131,-0.001l-2.713,0.0c-0.826,0.0 -1.486,0.668 -1.486,1.494L41.359,50.0l6.235,0.0L47.594,49.009z"
-        android:fill="#FFFFFF"/>
+        android:fillColor="#FFFFFF"/>
     <path
         android:pathData="M39.714,39.838 h18.221 v18.221 h-18.221z"
-        android:fill="#00000000"/>
+        android:fillColor="#00000000"/>
     <path
         android:pathData="M47.594,49.009 h3.0 v0.991 h-3.0z"
-        android:fill="#00000000"/>
+        android:fillColor="#00000000"/>
     <path
         android:pathData="M47.594,51.0 h3.0 v1.009 h-3.0z"
-        android:fill="#00000000"/>
+        android:fillColor="#00000000"/>
     <path
         android:pathData="M46.0,43.0l6.0,0.0l0.0,1.0l-6.0,0.0z"
-        android:fill="#FFFFFF"/>
+        android:fillColor="#FFFFFF"/>
 </vector>
diff --git a/core/res/res/drawable/ic_lock_bugreport.xml b/core/res/res/drawable/ic_lock_bugreport.xml
index b93a09a..8540eee 100644
--- a/core/res/res/drawable/ic_lock_bugreport.xml
+++ b/core/res/res/drawable/ic_lock_bugreport.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="?attr/colorControlNormal"
+        android:fillColor="?attr/colorControlNormal"
         android:pathData="M20.0,8.0l-2.8,0.0c-0.5,-0.8 -1.1,-1.5 -1.8,-2.0L17.0,4.4L15.6,3.0l-2.2,2.2C13.0,5.1 12.5,5.0 12.0,5.0s-1.0,0.1 -1.4,0.2L8.4,3.0L7.0,4.4L8.6,6.0C7.9,6.5 7.3,7.2 6.8,8.0L4.0,8.0l0.0,2.0l2.1,0.0C6.0,10.3 6.0,10.7 6.0,11.0l0.0,1.0L4.0,12.0l0.0,2.0l2.0,0.0l0.0,1.0c0.0,0.3 0.0,0.7 0.1,1.0L4.0,16.0l0.0,2.0l2.8,0.0c1.0,1.8 3.0,3.0 5.2,3.0s4.2,-1.2 5.2,-3.0L20.0,18.0l0.0,-2.0l-2.1,0.0c0.1,-0.3 0.1,-0.7 0.1,-1.0l0.0,-1.0l2.0,0.0l0.0,-2.0l-2.0,0.0l0.0,-1.0c0.0,-0.3 0.0,-0.7 -0.1,-1.0L20.0,10.0L20.0,8.0zM14.0,16.0l-4.0,0.0l0.0,-2.0l4.0,0.0L14.0,16.0zM14.0,12.0l-4.0,0.0l0.0,-2.0l4.0,0.0L14.0,12.0z"/>
 </vector>
diff --git a/core/res/res/drawable/stat_notify_disabled_data.xml b/core/res/res/drawable/stat_notify_disabled_data.xml
index d287a75..2f6ffaf 100644
--- a/core/res/res/drawable/stat_notify_disabled_data.xml
+++ b/core/res/res/drawable/stat_notify_disabled_data.xml
@@ -13,25 +13,22 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M40.709,4.5l-6.604,7.337 0.0,16.601 6.604,6.604z"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M32.305,13.838l-6.0629997,6.7370005 6.0629997,6.0629997z"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M15.498,40.5l0.0,-7.9869995 -7.205,7.9869995z"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M10.265,9.72l-2.5460005,2.545 9.971001,9.971 3.7139988,3.7140007 -4.105999,4.5619984 0.0,9.988001 6.6019993,0.0 0.0,-12.054001 1.8029995,1.8030014 0.0,10.250999 6.602001,0.0 0.0,-3.6479988 1.7999992,1.7999992 1.8479996,1.8479996 4.670002,4.669998 2.5459976,-2.5459976z"/>
 </vector>
diff --git a/core/res/res/drawable/vector_drawable_progress_bar_large.xml b/core/res/res/drawable/vector_drawable_progress_bar_large.xml
index 6e0840c..3bf3cd7 100644
--- a/core/res/res/drawable/vector_drawable_progress_bar_large.xml
+++ b/core/res/res/drawable/vector_drawable_progress_bar_large.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="76dp"
-        android:width="76dp" />
-
-    <viewport
+        android:width="76dp"
         android:viewportHeight="48"
-        android:viewportWidth="48" />
+        android:viewportWidth="48" >
 
     <group
         android:name="root"
@@ -29,9 +25,9 @@
         android:translateY="24.0" >
         <path
             android:name="progressBar"
-            android:fill="#00000000"
+            android:fillColor="#00000000"
             android:pathData="M0, 0 m 0, -19 a 19,19 0 1,1 0,38 a 19,19 0 1,1 0,-38"
-            android:stroke="?attr/colorControlActivated"
+            android:strokeColor="?attr/colorControlActivated"
             android:strokeLineCap="round"
             android:strokeLineJoin="miter"
             android:strokeWidth="4"
diff --git a/core/res/res/drawable/vector_drawable_progress_bar_medium.xml b/core/res/res/drawable/vector_drawable_progress_bar_medium.xml
index 7f1231c..62f9225 100644
--- a/core/res/res/drawable/vector_drawable_progress_bar_medium.xml
+++ b/core/res/res/drawable/vector_drawable_progress_bar_medium.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="48dp"
-        android:width="48dp" />
-
-    <viewport
+        android:width="48dp"
         android:viewportHeight="48"
-        android:viewportWidth="48" />
+        android:viewportWidth="48" >
 
     <group
         android:name="root"
@@ -29,9 +25,9 @@
         android:translateY="24.0" >
         <path
             android:name="progressBar"
-            android:fill="#00000000"
+            android:fillColor="#00000000"
             android:pathData="M0, 0 m 0, -19 a 19,19 0 1,1 0,38 a 19,19 0 1,1 0,-38"
-            android:stroke="?attr/colorControlActivated"
+            android:strokeColor="?attr/colorControlActivated"
             android:strokeLineCap="round"
             android:strokeLineJoin="miter"
             android:strokeWidth="4"
diff --git a/core/res/res/drawable/vector_drawable_progress_bar_small.xml b/core/res/res/drawable/vector_drawable_progress_bar_small.xml
index 58ca101..1352cfc 100644
--- a/core/res/res/drawable/vector_drawable_progress_bar_small.xml
+++ b/core/res/res/drawable/vector_drawable_progress_bar_small.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="16dp"
-        android:width="16dp" />
-
-    <viewport
+        android:width="16dp"
         android:viewportHeight="48"
-        android:viewportWidth="48" />
+        android:viewportWidth="48" >
 
     <group
         android:name="root"
@@ -29,9 +25,9 @@
         android:translateY="24.0" >
         <path
             android:name="progressBar"
-            android:fill="#00000000"
+            android:fillColor="#00000000"
             android:pathData="M0, 0 m 0, -19 a 19,19 0 1,1 0,38 a 19,19 0 1,1 0,-38"
-            android:stroke="?attr/colorControlActivated"
+            android:strokeColor="?attr/colorControlActivated"
             android:strokeLineCap="round"
             android:strokeLineJoin="miter"
             android:strokeWidth="4"
diff --git a/core/res/res/layout/app_not_authorized.xml b/core/res/res/layout/app_not_authorized.xml
index bd40eeb..2188511 100644
--- a/core/res/res/layout/app_not_authorized.xml
+++ b/core/res/res/layout/app_not_authorized.xml
@@ -32,7 +32,7 @@
         android:paddingBottom="16dip"
         android:paddingStart="16dip"
         android:paddingEnd="16dip"
-        android:text="@string/app_no_restricted_accounts"
+        android:text="@string/error_message_change_not_allowed"
     />
 
     <!-- Horizontal divider line -->
diff --git a/core/res/res/layout/app_permission_item.xml b/core/res/res/layout/app_permission_item.xml
index e2ffffb..1eff3dc 100644
--- a/core/res/res/layout/app_permission_item.xml
+++ b/core/res/res/layout/app_permission_item.xml
@@ -27,8 +27,8 @@
 
     <ImageView
         android:id="@+id/perm_icon"
-        android:layout_width="32dp"
-        android:layout_height="32dp"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
         android:layout_marginStart="16dp"
         android:layout_marginEnd="8dp"
         android:scaleType="fitCenter" />
diff --git a/core/res/res/layout/app_permission_item_money.xml b/core/res/res/layout/app_permission_item_money.xml
index 3fa4653..7e1aca1 100644
--- a/core/res/res/layout/app_permission_item_money.xml
+++ b/core/res/res/layout/app_permission_item_money.xml
@@ -27,8 +27,8 @@
 
     <ImageView
         android:id="@+id/perm_icon"
-        android:layout_width="32dp"
-        android:layout_height="32dp"
+        android:layout_width="24dp"
+        android:layout_height="24dp"
         android:layout_marginStart="16dp"
         android:layout_marginEnd="8dp"
         android:scaleType="fitCenter" />
diff --git a/core/res/res/layout/app_permission_item_old.xml b/core/res/res/layout/app_permission_item_old.xml
index ce0cd42..de6fc4f 100644
--- a/core/res/res/layout/app_permission_item_old.xml
+++ b/core/res/res/layout/app_permission_item_old.xml
@@ -26,8 +26,8 @@
 
     <ImageView
         android:id="@+id/perm_icon"
-        android:layout_width="30dip"
-        android:layout_height="30dip"
+        android:layout_width="24dip"
+        android:layout_height="24dip"
         android:layout_alignParentStart="true"
         android:scaleType="fitCenter" />
 
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index fedea4e..184198b 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -1847,6 +1847,9 @@
 
         <!-- Elevation to use for the window. -->
         <attr name="windowElevation" format="dimension" />
+
+        <!-- Whether to clip window content to the outline of the window background. -->
+        <attr name="windowClipToOutline" format="boolean" />
     </declare-styleable>
 
     <!-- The set of attributes that describe a AlertDialog's theme. -->
@@ -5116,24 +5119,16 @@
         <!-- Indicates if the drawable needs to be mirrored when its layout direction is
              RTL (right-to-left). -->
         <attr name="autoMirrored" />
-    </declare-styleable>
-
-    <!-- Define the virtual size of the drawing surface paths will draw to. -->
-    <declare-styleable name="VectorDrawableViewport">
+        <!-- The intrinsic width of the Vector Drawable. -->
+        <attr name="width" />
+        <!-- The intrinsic height of the Vector Drawable. -->
+        <attr name="height" />
         <!-- The width of the canvas the drawing is on. -->
         <attr name="viewportWidth" format="float"/>
         <!-- The height of the canvas the drawing is on. -->
         <attr name="viewportHeight" format="float"/>
     </declare-styleable>
 
-    <!-- Define the size of the drawable -->
-    <declare-styleable name="VectorDrawableSize">
-        <!-- Width of the Vector Drawable. -->
-        <attr name="width" />
-        <!-- Height of the Vector Drawable. -->
-        <attr name="height" />
-    </declare-styleable>
-
     <!-- Defines the group used in VectorDrawables. -->
     <declare-styleable name="VectorDrawableGroup">
         <!-- The Name of this group -->
@@ -5165,9 +5160,9 @@
         <!-- The opacity of a path stroke -->
         <attr name="strokeOpacity" format="float" />
         <!-- The color to stroke the path if not defined implies no stroke-->
-        <attr name="stroke" format="color" />
+        <attr name="strokeColor" format="color" />
         <!-- The color to fill the path if not defined implies no fill-->
-        <attr name="fill" format="color" />
+        <attr name="fillColor" format="color" />
         <!-- The level of opacity of the filled area of the path -->
         <attr name="fillOpacity" format="float" />
         <!-- The specification of the operations that define the path  -->
@@ -5178,7 +5173,7 @@
         <attr name="trimPathEnd" format="float" />
         <!-- Shift trim region (allows visible region to include the start and end) from 0 to 1  -->
         <attr name="trimPathOffset" format="float" />
-        <!-- Path will set the current clip path -->
+        <!-- TODO: Remove this. Path will set the current clip path -->
         <attr name="clipToPath" format="boolean" />
         <!-- sets the linecap for a stroked path -->
         <attr name="strokeLineCap" format="enum">
@@ -5196,6 +5191,14 @@
         <attr name="strokeMiterLimit" format="float"/>
     </declare-styleable>
 
+    <!-- Defines the clip path used in VectorDrawables. -->
+    <declare-styleable name="VectorDrawableClipPath">
+        <!-- The Name of this path -->
+        <attr name="name" />
+        <!-- The specification of the operations that define the path  -->
+        <attr name="pathData"/>
+    </declare-styleable>
+
     <!-- ========================== -->
     <!--   AnimatedVectorDrawable class   -->
     <!-- ========================== -->
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index a6e85e9..0a87d0d 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2119,9 +2119,9 @@
   <public type="attr" name="viewportWidth" />
   <public type="attr" name="viewportHeight" />
   <public type="attr" name="fillOpacity" />
-  <public type="attr" name="fill" />
+  <public type="attr" name="fillColor" />
   <public type="attr" name="pathData" />
-  <public type="attr" name="stroke" />
+  <public type="attr" name="strokeColor" />
   <public type="attr" name="strokeOpacity" />
   <public type="attr" name="strokeWidth" />
   <public type="attr" name="trimPathStart" />
@@ -2268,6 +2268,7 @@
   <public type="attr" name="checkMarkTintMode" />
   <public type="attr" name="popupTheme" />
   <public type="attr" name="toolbarStyle" />
+  <public type="attr" name="windowClipToOutline" />
 
   <public-padding type="dimen" name="l_resource_pad" end="0x01050010" />
 
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 056c1a6..c6ee89f 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4513,8 +4513,8 @@
     <string name="owner_name" msgid="3879126011135546571">Owner</string>
     <!-- Error message title [CHAR LIMIT=35] -->
     <string name="error_message_title">Error</string>
-    <!-- Message informing user that app is not permitted to access accounts. [CHAR LIMIT=none] -->
-    <string name="app_no_restricted_accounts">This app doesn\'t support accounts for restricted profiles</string>
+    <!-- Message informing user that the change was disallowed by an administrator. [CHAR LIMIT=none] -->
+    <string name="error_message_change_not_allowed">This change isn\'t allowed by your administrator</string>
     <!-- Message informing user that the requested activity could not be found [CHAR LIMIT=none] -->
     <string name="app_not_found">No application found to handle this action</string>
     <string name="revoke">Revoke</string>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index e9b9889..30209e9 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -877,7 +877,7 @@
   <java-symbol type="string" name="config_customResolverActivity" />
   <java-symbol type="string" name="config_appsAuthorizedForSharedAccounts" />
   <java-symbol type="string" name="error_message_title" />
-  <java-symbol type="string" name="app_no_restricted_accounts" />
+  <java-symbol type="string" name="error_message_change_not_allowed" />
   <java-symbol type="string" name="action_bar_home_description_format" />
   <java-symbol type="string" name="action_bar_home_subtitle_description_format" />
   <java-symbol type="string" name="wireless_display_route_description" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index 0d4a2bf..aea72c1 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -169,6 +169,7 @@
 
         <!-- Window attributes -->
         <item name="windowBackground">@drawable/screen_background_selector_dark</item>
+        <item name="windowClipToOutline">false</item>
         <item name="windowFrame">@null</item>
         <item name="windowNoTitle">false</item>
         <item name="windowFullscreen">false</item>
@@ -473,6 +474,8 @@
          <p>This is designed for API level 10 and lower.</p>-->
     <style name="Theme.Light">
         <item name="windowBackground">@drawable/screen_background_selector_light</item>
+        <item name="windowClipToOutline">false</item>
+
         <item name="colorBackground">@color/background_light</item>
         <item name="colorForeground">@color/bright_foreground_light</item>
         <item name="colorForegroundInverse">@color/bright_foreground_light_inverse</item>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 741ffe6..f2233e0 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -146,6 +146,7 @@
 
         <!-- Window attributes -->
         <item name="windowBackground">@color/background_material_dark</item>
+        <item name="windowClipToOutline">true</item>
         <item name="windowFrame">@null</item>
         <item name="windowNoTitle">false</item>
         <item name="windowFullscreen">false</item>
@@ -512,6 +513,7 @@
 
         <!-- Window attributes -->
         <item name="windowBackground">@color/background_material_light</item>
+        <item name="windowClipToOutline">true</item>
         <item name="windowFrame">@null</item>
         <item name="windowNoTitle">false</item>
         <item name="windowFullscreen">false</item>
diff --git a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java
index e259bcc..ccdd90a 100644
--- a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java
+++ b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java
@@ -27,8 +27,7 @@
 /**
  * Unit test cases for {@link ScanRecord}.
  * <p>
- * To run this test, use adb shell am instrument -e class
- * 'android.bluetooth.ScanRecordTest' -w
+ * To run this test, use adb shell am instrument -e class 'android.bluetooth.ScanRecordTest' -w
  * 'com.android.bluetooth.tests/android.bluetooth.BluetoothTestRunner'
  */
 public class ScanRecordTest extends TestCase {
@@ -54,13 +53,13 @@
         assertEquals("Ped", data.getDeviceName());
         assertEquals(-20, data.getTxPowerLevel());
 
-        assertEquals(224, data.getManufacturerId());
+        assertEquals(0x00e0, data.getManufacturerId());
         assertArrayEquals(new byte[] {
-                (byte) 0xe0, 0x00, 0x02, 0x15 }, data.getManufacturerSpecificData());
+                0x02, 0x15 }, data.getManufacturerSpecificData());
 
         assertEquals(uuid2, data.getServiceDataUuid());
         assertArrayEquals(new byte[] {
-                0x0b, 0x11, 0x50, 0x64 }, data.getServiceData());
+                0x50, 0x64 }, data.getServiceData());
     }
 
     // Assert two byte arrays are equal.
diff --git a/data/fonts/Android.mk b/data/fonts/Android.mk
index 9f6b64c..80fb1fd 100644
--- a/data/fonts/Android.mk
+++ b/data/fonts/Android.mk
@@ -47,14 +47,8 @@
     DroidSans-Bold.ttf
 
 ################################
-# On space-constrained devices, we include a subset of fonts:
-ifeq ($(SMALLER_FONT_FOOTPRINT),true)
-
-droidsans_fallback_src := DroidSansFallback.ttf
-
-else  # !SMALLER_FONT_FOOTPRINT
-
-droidsans_fallback_src := DroidSansFallbackFull.ttf
+# Do not include Motoya on space-constrained devices
+ifneq ($(SMALLER_FONT_FOOTPRINT),true)
 
 include $(CLEAR_VARS)
 LOCAL_MODULE := MTLmr3m.ttf
@@ -65,24 +59,44 @@
 include $(BUILD_PREBUILT)
 extra_font_files += MTLmr3m.ttf
 
-endif  # SMALLER_FONT_FOOTPRINT
+endif  # !SMALLER_FONT_FOOTPRINT
 
 ################################
+# Use DroidSansMono to hang extra_font_files on
+include $(CLEAR_VARS)
+LOCAL_MODULE := DroidSansMono.ttf
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_TAGS := optional
+LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
+LOCAL_REQUIRED_MODULES := $(extra_font_files)
+include $(BUILD_PREBUILT)
+extra_font_files :=
+
+################################
+# Include DroidSansFallback only on non-EXTENDED_FONT_FOOTPRINT builds
+ifneq ($(EXTENDED_FONT_FOOTPRINT),true)
+
+# Include a subset of DroidSansFallback on SMALLER_FONT_FOOTPRINT build
+ifeq ($(SMALLER_FONT_FOOTPRINT),true)
+droidsans_fallback_src := DroidSansFallback.ttf
+else  # !SMALLER_FONT_FOOTPRINT
+droidsans_fallback_src := DroidSansFallbackFull.ttf
+endif  # SMALLER_FONT_FOOTPRINT
+
 include $(CLEAR_VARS)
 LOCAL_MODULE := DroidSansFallback.ttf
 LOCAL_SRC_FILES := $(droidsans_fallback_src)
 LOCAL_MODULE_CLASS := ETC
 LOCAL_MODULE_TAGS := optional
 LOCAL_MODULE_PATH := $(TARGET_OUT)/fonts
-LOCAL_REQUIRED_MODULES := $(extra_font_files)
 include $(BUILD_PREBUILT)
-
-font_symlink_src :=
-font_symlink :=
 droidsans_fallback_src :=
-extra_font_files :=
+
+endif  # !EXTENDED_FONT_FOOTPRINT
+
 ################################
-# Build the rest font files as prebuilt.
+# Build the rest of font files as prebuilt.
 
 # $(1): The source file name in LOCAL_PATH.
 #       It also serves as the module name and the dest file name.
@@ -101,7 +115,6 @@
     Roboto-Bold.ttf \
     Roboto-Italic.ttf \
     Roboto-BoldItalic.ttf \
-    DroidSansMono.ttf \
     Clockopia.ttf \
     AndroidClock.ttf \
     AndroidClock_Highlight.ttf \
diff --git a/data/fonts/DroidKufi-Bold.ttf b/data/fonts/DroidKufi-Bold.ttf
deleted file mode 100644
index 650919e..0000000
--- a/data/fonts/DroidKufi-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/DroidKufi-Regular.ttf b/data/fonts/DroidKufi-Regular.ttf
deleted file mode 100644
index af85975..0000000
--- a/data/fonts/DroidKufi-Regular.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/DroidSans-Bold.ttf b/data/fonts/DroidSans-Bold.ttf
deleted file mode 100644
index d065b64..0000000
--- a/data/fonts/DroidSans-Bold.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/DroidSans.ttf b/data/fonts/DroidSans.ttf
deleted file mode 100644
index ad1efca..0000000
--- a/data/fonts/DroidSans.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/DroidSansFallbackFull.ttf b/data/fonts/DroidSansFallbackFull.ttf
index 135723c..1dfcc33 100644
--- a/data/fonts/DroidSansFallbackFull.ttf
+++ b/data/fonts/DroidSansFallbackFull.ttf
Binary files differ
diff --git a/data/fonts/DroidSansJapanese.ttf b/data/fonts/DroidSansJapanese.ttf
deleted file mode 100644
index 412fa3d..0000000
--- a/data/fonts/DroidSansJapanese.ttf
+++ /dev/null
Binary files differ
diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
index 11c2571..54683aa 100644
--- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java
@@ -49,13 +49,11 @@
  * </p>
  * <li>Here is a simple VectorDrawable in this vectordrawable.xml file.
  * <pre>
- * &lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; &gt;
- *     &lt;size
- *         android:height=&quot;64dp&quot;
- *         android:width=&quot;64dp&quot; /&gt;
- *     &lt;viewport
- *         android:viewportHeight=&quot;600&quot;
- *         android:viewportWidth=&quot;600&quot; /&gt;
+ * &lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
+ *     android:height=&quot;64dp&quot;
+ *     android:width=&quot;64dp&quot;
+ *     android:viewportHeight=&quot;600&quot;
+ *     android:viewportWidth=&quot;600&quot; &gt;
  *     &lt;group
  *         android:name=&quot;rotationGroup&quot;
  *         android:pivotX=&quot;300.0&quot;
@@ -63,7 +61,7 @@
  *         android:rotation=&quot;45.0&quot; &gt;
  *         &lt;path
  *             android:name=&quot;v&quot;
- *             android:fill=&quot;#000000&quot;
+ *             android:fillColor=&quot;#000000&quot;
  *             android:pathData=&quot;M300,70 l 0,-70 70,70 0,0 -70,70z&quot; /&gt;
  *     &lt;/group&gt;
  * &lt;/vector&gt;
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index f32fa1f..f41b11a 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -54,76 +54,130 @@
  * <p/>
  * The vector drawable has the following elements:
  * <p/>
- * <dl>
  * <dt><code>&lt;vector></code></dt>
- * <dd>Used to defined a vector drawable</dd>
- * <dt><code>&lt;size></code></dt>
- * <dd>Used to defined the intrinsic Width Height size of the drawable using
- * <code>android:width</code> and <code>android:height</code></dd>
- * <dt><code>&lt;viewport></code></dt>
- * <dd>Used to defined the size of the virtual canvas the paths are drawn on.
- * The size is defined using the attributes <code>android:viewportHeight</code>
- * <code>android:viewportWidth</code></dd>
+ * <dl>
+ * <dd>Used to defined a vector drawable
+ * <dl>
+ * <dt><code>android:width</code></dt>
+ * <dd>Used to defined the intrinsic width of the drawable.
+ * This support all the dimension units, normally specified with dp.</dd>
+ * <dt><code>android:height</code></dt>
+ * <dd>Used to defined the intrinsic height the drawable.
+ * This support all the dimension units, normally specified with dp.</dd>
+ * <dt><code>android:viewportWidth</code></dt>
+ * <dd>Used to defined the width of the viewport space. Viewport is basically
+ * the virtual canvas where the paths are drawn on.</dd>
+ * <dt><code>android:viewportHeight</code></dt>
+ * <dd>Used to defined the height of the viewport space. Viewport is basically
+ * the virtual canvas where the paths are drawn on.</dd>
+ * <dt><code>android:tint</code></dt>
+ * <dd>The color to apply to the drawable as a tint. By default, no tint is applied.</dd>
+ * <dt><code>android:tintMode</code></dt>
+ * <dd>The Porter-Duff blending mode for the tint color. The default value is src_in.</dd>
+ * <dt><code>android:autoMirrored</code></dt>
+ * <dd>Indicates if the drawable needs to be mirrored when its layout direction is
+ * RTL (right-to-left).</dd>
+ * </dl></dd>
+ * </dl>
+ *
+ * <dl>
  * <dt><code>&lt;group></code></dt>
  * <dd>Defines a group of paths or subgroups, plus transformation information.
  * The transformations are defined in the same coordinates as the viewport.
- * And the transformations are applied in the order of scale, rotate then translate. </dd>
- * <dt><code>android:rotation</code>
- * <dd>The degrees of rotation of the group.</dd></dt>
- * <dt><code>android:pivotX</code>
- * <dd>The X coordinate of the pivot for the scale and rotation of the group</dd></dt>
- * <dt><code>android:pivotY</code>
- * <dd>The Y coordinate of the pivot for the scale and rotation of the group</dd></dt>
- * <dt><code>android:scaleX</code>
- * <dd>The amount of scale on the X Coordinate</dd></dt>
- * <dt><code>android:scaleY</code>
- * <dd>The amount of scale on the Y coordinate</dd></dt>
- * <dt><code>android:translateX</code>
- * <dd>The amount of translation on the X coordinate</dd></dt>
- * <dt><code>android:translateY</code>
- * <dd>The amount of translation on the Y coordinate</dd></dt>
+ * And the transformations are applied in the order of scale, rotate then translate.
+ * <dl>
+ * <dt><code>android:rotation</code></dt>
+ * <dd>The degrees of rotation of the group.</dd>
+ * <dt><code>android:pivotX</code></dt>
+ * <dd>The X coordinate of the pivot for the scale and rotation of the group.
+ * This is defined in the viewport space.</dd>
+ * <dt><code>android:pivotY</code></dt>
+ * <dd>The Y coordinate of the pivot for the scale and rotation of the group.
+ * This is defined in the viewport space.</dd>
+ * <dt><code>android:scaleX</code></dt>
+ * <dd>The amount of scale on the X Coordinate.</dd>
+ * <dt><code>android:scaleY</code></dt>
+ * <dd>The amount of scale on the Y coordinate.</dd>
+ * <dt><code>android:translateX</code></dt>
+ * <dd>The amount of translation on the X coordinate.
+ * This is defined in the viewport space.</dd>
+ * <dt><code>android:translateY</code></dt>
+ * <dd>The amount of translation on the Y coordinate.
+ * This is defined in the viewport space.</dd>
+ * </dl></dd>
+ * </dl>
+ *
+ * <dl>
  * <dt><code>&lt;path></code></dt>
  * <dd>Defines paths to be drawn.
  * <dl>
- * <dt><code>android:name</code>
- * <dd>Defines the name of the path.</dd></dt>
- * <dt><code>android:pathData</code>
+ * <dt><code>android:name</code></dt>
+ * <dd>Defines the name of the path.</dd>
+ * <dt><code>android:pathData</code></dt>
  * <dd>Defines path string. This is using exactly same format as "d" attribute
- * in the SVG's path data</dd></dt>
- * <dt><code>android:fill</code>
- * <dd>Defines the color to fill the path (none if not present).</dd></dt>
- * <dt><code>android:stroke</code>
+ * in the SVG's path data. This is defined in the viewport space.</dd>
+ * <dt><code>android:fillColor</code></dt>
+ * <dd>Defines the color to fill the path (none if not present).</dd>
+ * <dt><code>android:strokeColor</code></dt>
  * <dd>Defines the color to draw the path outline (none if not present).</dd>
- * </dt>
- * <dt><code>android:strokeWidth</code>
- * <dd>The width a path stroke</dd></dt>
- * <dt><code>android:strokeOpacity</code>
- * <dd>The opacity of a path stroke</dd></dt>
- * <dt><code>android:fillOpacity</code>
- * <dd>The opacity to fill the path with</dd></dt>
- * <dt><code>android:trimPathStart</code>
- * <dd>The fraction of the path to trim from the start from 0 to 1</dd></dt>
- * <dt><code>android:trimPathEnd</code>
- * <dd>The fraction of the path to trim from the end from 0 to 1</dd></dt>
- * <dt><code>android:trimPathOffset</code>
- * <dd>Shift trim region (allows showed region to include the start and end)
- * from 0 to 1</dd></dt>
- * <dt><code>android:clipToPath</code>
- * <dd>Path will set the clip path</dd></dt>
- * <dt><code>android:strokeLineCap</code>
- * <dd>Sets the linecap for a stroked path: butt, round, square</dd></dt>
- * <dt><code>android:strokeLineJoin</code>
- * <dd>Sets the lineJoin for a stroked path: miter,round,bevel</dd></dt>
- * <dt><code>android:strokeMiterLimit</code>
- * <dd>Sets the Miter limit for a stroked path</dd></dt>
+ * <dt><code>android:strokeWidth</code></dt>
+ * <dd>The width a path stroke.</dd>
+ * <dt><code>android:strokeOpacity</code></dt>
+ * <dd>The opacity of a path stroke.</dd>
+ * <dt><code>android:fillOpacity</code></dt>
+ * <dd>The opacity to fill the path with.</dd>
+ * <dt><code>android:trimPathStart</code></dt>
+ * <dd>The fraction of the path to trim from the start, in the range from 0 to 1.</dd>
+ * <dt><code>android:trimPathEnd</code></dt>
+ * <dd>The fraction of the path to trim from the end, in the range from 0 to 1.</dd>
+ * <dt><code>android:trimPathOffset</code></dt>
+ * <dd>Shift trim region (allows showed region to include the start and end), in the range
+ * from 0 to 1.</dd>
+ * <dt><code>android:strokeLineCap</code></dt>
+ * <dd>Sets the linecap for a stroked path: butt, round, square.</dd>
+ * <dt><code>android:strokeLineJoin</code></dt>
+ * <dd>Sets the lineJoin for a stroked path: miter,round,bevel.</dd>
+ * <dt><code>android:strokeMiterLimit</code></dt>
+ * <dd>Sets the Miter limit for a stroked path.</dd>
+ * </dl></dd>
  * </dl>
- * </dd>
+ *
+ * <dl>
+ * <dt><code>&lt;clip-path></code></dt>
+ * <dd>Defines path to be the current clip.
+ * <dl>
+ * <dt><code>android:name</code></dt>
+ * <dd>Defines the name of the clip path.</dd>
+ * <dt><code>android:pathData</code></dt>
+ * <dd>Defines clip path string. This is using exactly same format as "d" attribute
+ * in the SVG's path data.</dd>
+ * </dl></dd>
+ * </dl>
+ * <li>Here is a simple VectorDrawable in this vectordrawable.xml file.
+ * <pre>
+ * &lt;vector xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;
+ *     android:height=&quot;64dp&quot;
+ *     android:width=&quot;64dp&quot;
+ *     android:viewportHeight=&quot;600&quot;
+ *     android:viewportWidth=&quot;600&quot; &gt;
+ *     &lt;group
+ *         android:name=&quot;rotationGroup&quot;
+ *         android:pivotX=&quot;300.0&quot;
+ *         android:pivotY=&quot;300.0&quot;
+ *         android:rotation=&quot;45.0&quot; &gt;
+ *         &lt;path
+ *             android:name=&quot;v&quot;
+ *             android:fillColor=&quot;#000000&quot;
+ *             android:pathData=&quot;M300,70 l 0,-70 70,70 0,0 -70,70z&quot; /&gt;
+ *     &lt;/group&gt;
+ * &lt;/vector&gt;
+ * </pre></li>
  */
+
 public class VectorDrawable extends Drawable {
     private static final String LOGTAG = VectorDrawable.class.getSimpleName();
 
-    private static final String SHAPE_SIZE = "size";
-    private static final String SHAPE_VIEWPORT = "viewport";
+    private static final String SHAPE_CLIP_PATH = "clip-path";
     private static final String SHAPE_GROUP = "group";
     private static final String SHAPE_PATH = "path";
     private static final String SHAPE_VECTOR = "vector";
@@ -337,20 +391,24 @@
     @Override
     public void inflate(Resources res, XmlPullParser parser, AttributeSet attrs, Theme theme)
             throws XmlPullParserException, IOException {
-        final TypedArray a = obtainAttributes(res, theme, attrs, R.styleable.VectorDrawable);
+        final VectorDrawableState state = mVectorState;
+        final VPathRenderer pathRenderer = new VPathRenderer();
+        state.mVPathRenderer = pathRenderer;
+
+        TypedArray a = obtainAttributes(res, theme, attrs, R.styleable.VectorDrawable);
         updateStateFromTypedArray(a);
         a.recycle();
 
-        final VectorDrawableState state = mVectorState;
-        mVectorState.mCacheDirty = true;
+        state.mCacheDirty = true;
         inflateInternal(res, parser, attrs, theme);
 
         mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
         state.mVPathRenderer.setColorFilter(mTintFilter);
     }
 
-    private void updateStateFromTypedArray(TypedArray a) {
+    private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
         final VectorDrawableState state = mVectorState;
+        final VPathRenderer pathRenderer = state.mVPathRenderer;
 
         // Account for any configuration changes.
         state.mChangingConfigurations |= a.getChangingConfigurations();
@@ -370,16 +428,38 @@
 
         state.mAutoMirrored = a.getBoolean(
                 R.styleable.VectorDrawable_autoMirrored, state.mAutoMirrored);
+
+        pathRenderer.mViewportWidth = a.getFloat(
+                R.styleable.VectorDrawable_viewportWidth, pathRenderer.mViewportWidth);
+        pathRenderer.mViewportHeight = a.getFloat(
+                R.styleable.VectorDrawable_viewportHeight, pathRenderer.mViewportHeight);
+
+        if (pathRenderer.mViewportWidth <= 0) {
+            throw new XmlPullParserException(a.getPositionDescription() +
+                    "<viewport> tag requires viewportWidth > 0");
+        } else if (pathRenderer.mViewportHeight <= 0) {
+            throw new XmlPullParserException(a.getPositionDescription() +
+                    "<viewport> tag requires viewportHeight > 0");
+        }
+
+        pathRenderer.mBaseWidth = a.getDimension(
+                R.styleable.VectorDrawable_width, pathRenderer.mBaseWidth);
+        pathRenderer.mBaseHeight = a.getDimension(
+                R.styleable.VectorDrawable_height, pathRenderer.mBaseHeight);
+
+        if (pathRenderer.mBaseWidth <= 0) {
+            throw new XmlPullParserException(a.getPositionDescription() +
+                    "<size> tag requires width > 0");
+        } else if (pathRenderer.mBaseHeight <= 0) {
+            throw new XmlPullParserException(a.getPositionDescription() +
+                    "<size> tag requires height > 0");
+        }
     }
 
     private void inflateInternal(Resources res, XmlPullParser parser, AttributeSet attrs,
             Theme theme) throws XmlPullParserException, IOException {
         final VectorDrawableState state = mVectorState;
-        final VPathRenderer pathRenderer = new VPathRenderer();
-        state.mVPathRenderer = pathRenderer;
-
-        boolean noSizeTag = true;
-        boolean noViewportTag = true;
+        final VPathRenderer pathRenderer = state.mVPathRenderer;
         boolean noPathTag = true;
 
         // Use a stack to help to build the group tree.
@@ -394,7 +474,7 @@
                 final VGroup currentGroup = groupStack.peek();
 
                 if (SHAPE_PATH.equals(tagName)) {
-                    final VPath path = new VPath();
+                    final VFullPath path = new VFullPath();
                     path.inflate(res, attrs, theme);
                     currentGroup.mChildren.add(path);
                     if (path.getPathName() != null) {
@@ -402,14 +482,14 @@
                     }
                     noPathTag = false;
                     state.mChangingConfigurations |= path.mChangingConfigurations;
-                } else if (SHAPE_SIZE.equals(tagName)) {
-                    pathRenderer.parseSize(res, attrs);
-                    noSizeTag = false;
-                    state.mChangingConfigurations |= pathRenderer.mChangingConfigurations;
-                } else if (SHAPE_VIEWPORT.equals(tagName)) {
-                    pathRenderer.parseViewport(res, attrs);
-                    noViewportTag = false;
-                    state.mChangingConfigurations |= pathRenderer.mChangingConfigurations;
+                } else if (SHAPE_CLIP_PATH.equals(tagName)) {
+                    final VClipPath path = new VClipPath();
+                    path.inflate(res, attrs, theme);
+                    currentGroup.mChildren.add(path);
+                    if (path.getPathName() != null) {
+                        pathRenderer.mVGTargetsMap.put(path.getPathName(), path);
+                    }
+                    state.mChangingConfigurations |= path.mChangingConfigurations;
                 } else if (SHAPE_GROUP.equals(tagName)) {
                     VGroup newChildGroup = new VGroup();
                     newChildGroup.inflate(res, attrs, theme);
@@ -435,26 +515,13 @@
             printGroupTree(pathRenderer.mRootGroup, 0);
         }
 
-        if (noSizeTag || noViewportTag || noPathTag) {
+        if (noPathTag) {
             final StringBuffer tag = new StringBuffer();
 
-            if (noSizeTag) {
-                tag.append(SHAPE_SIZE);
+            if (tag.length() > 0) {
+                tag.append(" or ");
             }
-
-            if (noViewportTag) {
-                if (tag.length() > 0) {
-                    tag.append(" & ");
-                }
-                tag.append(SHAPE_SIZE);
-            }
-
-            if (noPathTag) {
-                if (tag.length() > 0) {
-                    tag.append(" or ");
-                }
-                tag.append(SHAPE_PATH);
-            }
+            tag.append(SHAPE_PATH);
 
             throw new XmlPullParserException("no " + tag + " defined");
         }
@@ -611,10 +678,10 @@
         // Variables below need to be copied (deep copy if applicable) for mutation.
         private int mChangingConfigurations;
         private final VGroup mRootGroup;
-        private float mBaseWidth = 0;
-        private float mBaseHeight = 0;
-        private float mViewportWidth = 0;
-        private float mViewportHeight = 0;
+        float mBaseWidth = 0;
+        float mBaseHeight = 0;
+        float mViewportWidth = 0;
+        float mViewportHeight = 0;
         private int mRootAlpha = 0xFF;
 
         final ArrayMap<String, Object> mVGTargetsMap = new ArrayMap<String, Object>();
@@ -736,7 +803,8 @@
 
         public void draw(Canvas canvas, int w, int h) {
             // Travese the tree in pre-order to draw.
-            drawGroupTree(mRootGroup, IDENTITY_MATRIX, ((float) mRootAlpha) / 0xFF, canvas, w, h);
+            drawGroupTree(mRootGroup, IDENTITY_MATRIX, ((float) mRootAlpha) / 0xFF,
+                    canvas, w, h);
         }
 
         private void drawPath(VGroup vGroup, VPath vPath, float stackedAlpha,
@@ -751,47 +819,48 @@
             vPath.toPath(mPath);
             final Path path = mPath;
 
-            if (vPath.mTrimPathStart != 0.0f || vPath.mTrimPathEnd != 1.0f) {
-                float start = (vPath.mTrimPathStart + vPath.mTrimPathOffset) % 1.0f;
-                float end = (vPath.mTrimPathEnd + vPath.mTrimPathOffset) % 1.0f;
-
-                if (mPathMeasure == null) {
-                    mPathMeasure = new PathMeasure();
-                }
-                mPathMeasure.setPath(mPath, false);
-
-                float len = mPathMeasure.getLength();
-                start = start * len;
-                end = end * len;
-                path.reset();
-                if (start > end) {
-                    mPathMeasure.getSegment(start, len, path, true);
-                    mPathMeasure.getSegment(0f, end, path, true);
-                } else {
-                    mPathMeasure.getSegment(start, end, path, true);
-                }
-                path.rLineTo(0, 0); // fix bug in measure
-            }
-
             mRenderPath.reset();
 
-            mRenderPath.addPath(path, mFinalPathMatrix);
-
-            if (vPath.mClip) {
+            if (vPath.isClipPath()) {
+                mRenderPath.addPath(path, mFinalPathMatrix);
                 canvas.clipPath(mRenderPath, Region.Op.REPLACE);
             } else {
-                if (vPath.mFillColor != 0) {
+                VFullPath fullPath = (VFullPath) vPath;
+                if (fullPath.mTrimPathStart != 0.0f || fullPath.mTrimPathEnd != 1.0f) {
+                    float start = (fullPath.mTrimPathStart + fullPath.mTrimPathOffset) % 1.0f;
+                    float end = (fullPath.mTrimPathEnd + fullPath.mTrimPathOffset) % 1.0f;
+
+                    if (mPathMeasure == null) {
+                        mPathMeasure = new PathMeasure();
+                    }
+                    mPathMeasure.setPath(mPath, false);
+
+                    float len = mPathMeasure.getLength();
+                    start = start * len;
+                    end = end * len;
+                    path.reset();
+                    if (start > end) {
+                        mPathMeasure.getSegment(start, len, path, true);
+                        mPathMeasure.getSegment(0f, end, path, true);
+                    } else {
+                        mPathMeasure.getSegment(start, end, path, true);
+                    }
+                    path.rLineTo(0, 0); // fix bug in measure
+                }
+                mRenderPath.addPath(path, mFinalPathMatrix);
+
+                if (fullPath.mFillColor != 0) {
                     if (mFillPaint == null) {
                         mFillPaint = new Paint();
                         mFillPaint.setColorFilter(mColorFilter);
                         mFillPaint.setStyle(Paint.Style.FILL);
                         mFillPaint.setAntiAlias(true);
                     }
-                    mFillPaint.setColor(applyAlpha(vPath.mFillColor, stackedAlpha));
+                    mFillPaint.setColor(applyAlpha(fullPath.mFillColor, stackedAlpha));
                     canvas.drawPath(mRenderPath, mFillPaint);
                 }
 
-                if (vPath.mStrokeColor != 0) {
+                if (fullPath.mStrokeColor != 0) {
                     if (mStrokePaint == null) {
                         mStrokePaint = new Paint();
                         mStrokePaint.setColorFilter(mColorFilter);
@@ -800,70 +869,25 @@
                     }
 
                     final Paint strokePaint = mStrokePaint;
-                    if (vPath.mStrokeLineJoin != null) {
-                        strokePaint.setStrokeJoin(vPath.mStrokeLineJoin);
+                    if (fullPath.mStrokeLineJoin != null) {
+                        strokePaint.setStrokeJoin(fullPath.mStrokeLineJoin);
                     }
 
-                    if (vPath.mStrokeLineCap != null) {
-                        strokePaint.setStrokeCap(vPath.mStrokeLineCap);
+                    if (fullPath.mStrokeLineCap != null) {
+                        strokePaint.setStrokeCap(fullPath.mStrokeLineCap);
                     }
 
-                    strokePaint.setStrokeMiter(vPath.mStrokeMiterlimit * minScale);
+                    strokePaint.setStrokeMiter(fullPath.mStrokeMiterlimit * minScale);
 
-                    strokePaint.setColor(applyAlpha(vPath.mStrokeColor, stackedAlpha));
-                    strokePaint.setStrokeWidth(vPath.mStrokeWidth * minScale);
+                    strokePaint.setColor(applyAlpha(fullPath.mStrokeColor, stackedAlpha));
+                    strokePaint.setStrokeWidth(fullPath.mStrokeWidth * minScale);
                     canvas.drawPath(mRenderPath, strokePaint);
                 }
             }
         }
-
-        private void parseViewport(Resources r, AttributeSet attrs)
-                throws XmlPullParserException {
-            final TypedArray a = r.obtainAttributes(attrs, R.styleable.VectorDrawableViewport);
-
-            // Account for any configuration changes.
-            mChangingConfigurations |= a.getChangingConfigurations();
-
-            mViewportWidth = a.getFloat(
-                    R.styleable.VectorDrawableViewport_viewportWidth, mViewportWidth);
-            mViewportHeight = a.getFloat(
-                    R.styleable.VectorDrawableViewport_viewportHeight, mViewportHeight);
-
-            if (mViewportWidth <= 0) {
-                throw new XmlPullParserException(a.getPositionDescription() +
-                        "<viewport> tag requires viewportWidth > 0");
-            } else if (mViewportHeight <= 0) {
-                throw new XmlPullParserException(a.getPositionDescription() +
-                        "<viewport> tag requires viewportHeight > 0");
-            }
-
-            a.recycle();
-        }
-
-        private void parseSize(Resources r, AttributeSet attrs)
-                throws XmlPullParserException {
-            final TypedArray a = r.obtainAttributes(attrs, R.styleable.VectorDrawableSize);
-
-            // Account for any configuration changes.
-            mChangingConfigurations |= a.getChangingConfigurations();
-
-            mBaseWidth = a.getDimension(R.styleable.VectorDrawableSize_width, mBaseWidth);
-            mBaseHeight = a.getDimension(R.styleable.VectorDrawableSize_height, mBaseHeight);
-
-            if (mBaseWidth <= 0) {
-                throw new XmlPullParserException(a.getPositionDescription() +
-                        "<size> tag requires width > 0");
-            } else if (mBaseHeight <= 0) {
-                throw new XmlPullParserException(a.getPositionDescription() +
-                        "<size> tag requires height > 0");
-            }
-
-            a.recycle();
-        }
-
     }
 
-    static class VGroup {
+    private static class VGroup {
         // mStackedMatrix is only used temporarily when drawing, it combines all
         // the parents' local matrices with the current one.
         private final Matrix mStackedMatrix = new Matrix();
@@ -912,9 +936,15 @@
                 if (copyChild instanceof VGroup) {
                     VGroup copyGroup = (VGroup) copyChild;
                     mChildren.add(new VGroup(copyGroup, targetsMap));
-                } else if (copyChild instanceof VPath) {
-                    VPath copyPath = (VPath) copyChild;
-                    VPath newPath = new VPath(copyPath);
+                } else {
+                    VPath newPath = null;
+                    if (copyChild instanceof VFullPath) {
+                        newPath = new VFullPath((VFullPath) copyChild);
+                    } else if (copyChild instanceof VClipPath) {
+                        newPath = new VClipPath((VClipPath) copyChild);
+                    } else {
+                        throw new IllegalStateException("Unknown object in the tree!");
+                    }
                     mChildren.add(newPath);
                     if (newPath.mPathName != null) {
                         targetsMap.put(newPath.mPathName, newPath);
@@ -926,94 +956,6 @@
         public VGroup() {
         }
 
-        /* Getter and Setter */
-        public float getRotation() {
-            return mRotate;
-        }
-
-        public void setRotation(float rotation) {
-            if (rotation != mRotate) {
-                mRotate = rotation;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getPivotX() {
-            return mPivotX;
-        }
-
-        public void setPivotX(float pivotX) {
-            if (pivotX != mPivotX) {
-                mPivotX = pivotX;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getPivotY() {
-            return mPivotY;
-        }
-
-        public void setPivotY(float pivotY) {
-            if (pivotY != mPivotY) {
-                mPivotY = pivotY;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getScaleX() {
-            return mScaleX;
-        }
-
-        public void setScaleX(float scaleX) {
-            if (scaleX != mScaleX) {
-                mScaleX = scaleX;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getScaleY() {
-            return mScaleY;
-        }
-
-        public void setScaleY(float scaleY) {
-            if (scaleY != mScaleY) {
-                mScaleY = scaleY;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getTranslateX() {
-            return mTranslateX;
-        }
-
-        public void setTranslateX(float translateX) {
-            if (translateX != mTranslateX) {
-                mTranslateX = translateX;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getTranslateY() {
-            return mTranslateY;
-        }
-
-        public void setTranslateY(float translateY) {
-            if (translateY != mTranslateY) {
-                mTranslateY = translateY;
-                updateLocalMatrix();
-            }
-        }
-
-        public float getAlpha() {
-            return mGroupAlpha;
-        }
-
-        public void setAlpha(float groupAlpha) {
-            if (groupAlpha != mGroupAlpha) {
-                mGroupAlpha = groupAlpha;
-            }
-        }
-
         public String getGroupName() {
             return mGroupName;
         }
@@ -1062,7 +1004,8 @@
                 return;
             }
 
-            final TypedArray a = t.resolveAttributes(mThemeAttrs, R.styleable.VectorDrawablePath);
+            final TypedArray a = t.resolveAttributes(mThemeAttrs,
+                    R.styleable.VectorDrawableGroup);
             updateStateFromTypedArray(a);
             a.recycle();
         }
@@ -1076,9 +1019,207 @@
             mLocalMatrix.postRotate(mRotate, 0, 0);
             mLocalMatrix.postTranslate(mTranslateX + mPivotX, mTranslateY + mPivotY);
         }
+
+        /* Setters and Getters, used by animator from AnimatedVectorDrawable. */
+        @SuppressWarnings("unused")
+        public float getRotation() {
+            return mRotate;
+        }
+
+        @SuppressWarnings("unused")
+        public void setRotation(float rotation) {
+            if (rotation != mRotate) {
+                mRotate = rotation;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getPivotX() {
+            return mPivotX;
+        }
+
+        @SuppressWarnings("unused")
+        public void setPivotX(float pivotX) {
+            if (pivotX != mPivotX) {
+                mPivotX = pivotX;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getPivotY() {
+            return mPivotY;
+        }
+
+        @SuppressWarnings("unused")
+        public void setPivotY(float pivotY) {
+            if (pivotY != mPivotY) {
+                mPivotY = pivotY;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getScaleX() {
+            return mScaleX;
+        }
+
+        @SuppressWarnings("unused")
+        public void setScaleX(float scaleX) {
+            if (scaleX != mScaleX) {
+                mScaleX = scaleX;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getScaleY() {
+            return mScaleY;
+        }
+
+        @SuppressWarnings("unused")
+        public void setScaleY(float scaleY) {
+            if (scaleY != mScaleY) {
+                mScaleY = scaleY;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getTranslateX() {
+            return mTranslateX;
+        }
+
+        @SuppressWarnings("unused")
+        public void setTranslateX(float translateX) {
+            if (translateX != mTranslateX) {
+                mTranslateX = translateX;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getTranslateY() {
+            return mTranslateY;
+        }
+
+        @SuppressWarnings("unused")
+        public void setTranslateY(float translateY) {
+            if (translateY != mTranslateY) {
+                mTranslateY = translateY;
+                updateLocalMatrix();
+            }
+        }
+
+        @SuppressWarnings("unused")
+        public float getAlpha() {
+            return mGroupAlpha;
+        }
+
+        @SuppressWarnings("unused")
+        public void setAlpha(float groupAlpha) {
+            if (groupAlpha != mGroupAlpha) {
+                mGroupAlpha = groupAlpha;
+            }
+        }
     }
 
+    /**
+     * Common Path information for clip path and normal path.
+     */
     private static class VPath {
+        protected PathParser.PathDataNode[] mNodes = null;
+        String mPathName;
+        int mChangingConfigurations;
+
+        public VPath() {
+            // Empty constructor.
+        }
+
+        public VPath(VPath copy) {
+            mPathName = copy.mPathName;
+            mChangingConfigurations = copy.mChangingConfigurations;
+            mNodes = PathParser.deepCopyNodes(copy.mNodes);
+        }
+
+        public void toPath(Path path) {
+            path.reset();
+            if (mNodes != null) {
+                PathParser.PathDataNode.nodesToPath(mNodes, path);
+            }
+        }
+
+        public String getPathName() {
+            return mPathName;
+        }
+
+        public boolean canApplyTheme() {
+            return false;
+        }
+
+        public void applyTheme(Theme t) {
+        }
+
+        public boolean isClipPath() {
+            return false;
+        }
+
+        /* Setters and Getters, used by animator from AnimatedVectorDrawable. */
+        @SuppressWarnings("unused")
+        public PathParser.PathDataNode[] getPathData() {
+            return mNodes;
+        }
+
+        @SuppressWarnings("unused")
+        public void setPathData(PathParser.PathDataNode[] nodes) {
+            if (!PathParser.canMorph(mNodes, nodes)) {
+                // This should not happen in the middle of animation.
+                mNodes = PathParser.deepCopyNodes(nodes);
+            } else {
+                PathParser.updateNodes(mNodes, nodes);
+            }
+        }
+    }
+
+    /**
+     * Clip path, which only has name and pathData.
+     */
+    private static class VClipPath extends VPath{
+        public VClipPath() {
+            // Empty constructor.
+        }
+
+        public VClipPath(VClipPath copy) {
+            super(copy);
+        }
+
+        public void inflate(Resources r, AttributeSet attrs, Theme theme) {
+            final TypedArray a = obtainAttributes(r, theme, attrs,
+                    R.styleable.VectorDrawableClipPath);
+            updateStateFromTypedArray(a);
+            a.recycle();
+        }
+
+        private void updateStateFromTypedArray(TypedArray a) {
+            // Account for any configuration changes.
+            mChangingConfigurations |= a.getChangingConfigurations();
+
+            mPathName = a.getString(R.styleable.VectorDrawableClipPath_name);
+            mNodes = PathParser.createNodesFromPathData(a.getString(
+                    R.styleable.VectorDrawableClipPath_pathData));
+        }
+
+        @Override
+        public boolean isClipPath() {
+            return true;
+        }
+    }
+
+    /**
+     * Normal path, which contains all the fill / paint information.
+     */
+    private static class VFullPath extends VPath {
         /////////////////////////////////////////////////////
         // Variables below need to be copied (deep copy if applicable) for mutation.
         private int[] mThemeAttrs;
@@ -1093,20 +1234,16 @@
         float mTrimPathEnd = 1;
         float mTrimPathOffset = 0;
 
-        boolean mClip = false;
         Paint.Cap mStrokeLineCap = Paint.Cap.BUTT;
         Paint.Join mStrokeLineJoin = Paint.Join.MITER;
         float mStrokeMiterlimit = 4;
 
-        private PathParser.PathDataNode[] mNodes = null;
-        String mPathName;
-        private int mChangingConfigurations;
-
-        public VPath() {
+        public VFullPath() {
             // Empty constructor.
         }
 
-        public VPath(VPath copy) {
+        public VFullPath(VFullPath copy) {
+            super(copy);
             mThemeAttrs = copy.mThemeAttrs;
 
             mStrokeColor = copy.mStrokeColor;
@@ -1119,25 +1256,9 @@
             mTrimPathEnd = copy.mTrimPathEnd;
             mTrimPathOffset = copy.mTrimPathOffset;
 
-            mClip = copy.mClip;
             mStrokeLineCap = copy.mStrokeLineCap;
             mStrokeLineJoin = copy.mStrokeLineJoin;
             mStrokeMiterlimit = copy.mStrokeMiterlimit;
-
-            mNodes = PathParser.deepCopyNodes(copy.mNodes);
-            mPathName = copy.mPathName;
-            mChangingConfigurations = copy.mChangingConfigurations;
-        }
-
-        public void toPath(Path path) {
-            path.reset();
-            if (mNodes != null) {
-                PathParser.PathDataNode.nodesToPath(mNodes, path);
-            }
-        }
-
-        public String getPathName() {
-            return mPathName;
         }
 
         private Paint.Cap getStrokeLineCap(int id, Paint.Cap defValue) {
@@ -1166,22 +1287,78 @@
             }
         }
 
-        /* Setters and Getters, mostly used by animator from AnimatedVectorDrawable. */
-        @SuppressWarnings("unused")
-        public PathParser.PathDataNode[] getPathData() {
-            return mNodes;
+        @Override
+        public boolean canApplyTheme() {
+            return mThemeAttrs != null;
         }
 
-        @SuppressWarnings("unused")
-        public void setPathData(PathParser.PathDataNode[] nodes) {
-            if (!PathParser.canMorph(mNodes, nodes)) {
-                // This should not happen in the middle of animation.
-                mNodes = PathParser.deepCopyNodes(nodes);
-            } else {
-                PathParser.updateNodes(mNodes, nodes);
+        public void inflate(Resources r, AttributeSet attrs, Theme theme) {
+            final TypedArray a = obtainAttributes(r, theme, attrs,
+                    R.styleable.VectorDrawablePath);
+            updateStateFromTypedArray(a);
+            a.recycle();
+        }
+
+        private void updateStateFromTypedArray(TypedArray a) {
+            // Account for any configuration changes.
+            mChangingConfigurations |= a.getChangingConfigurations();
+
+            // Extract the theme attributes, if any.
+            mThemeAttrs = a.extractThemeAttrs();
+
+            mPathName = a.getString(R.styleable.VectorDrawablePath_name);
+            mNodes = PathParser.createNodesFromPathData(a.getString(
+                    R.styleable.VectorDrawablePath_pathData));
+
+            mFillColor = a.getColor(R.styleable.VectorDrawablePath_fillColor,
+                    mFillColor);
+            mFillOpacity = a.getFloat(R.styleable.VectorDrawablePath_fillOpacity,
+                    mFillOpacity);
+            mStrokeLineCap = getStrokeLineCap(a.getInt(
+                    R.styleable.VectorDrawablePath_strokeLineCap, -1), mStrokeLineCap);
+            mStrokeLineJoin = getStrokeLineJoin(a.getInt(
+                    R.styleable.VectorDrawablePath_strokeLineJoin, -1), mStrokeLineJoin);
+            mStrokeMiterlimit = a.getFloat(
+                    R.styleable.VectorDrawablePath_strokeMiterLimit, mStrokeMiterlimit);
+            mStrokeColor = a.getColor(R.styleable.VectorDrawablePath_strokeColor,
+                    mStrokeColor);
+            mStrokeOpacity = a.getFloat(R.styleable.VectorDrawablePath_strokeOpacity,
+                    mStrokeOpacity);
+            mStrokeWidth = a.getFloat(R.styleable.VectorDrawablePath_strokeWidth,
+                    mStrokeWidth);
+            mTrimPathEnd = a.getFloat(R.styleable.VectorDrawablePath_trimPathEnd,
+                    mTrimPathEnd);
+            mTrimPathOffset = a.getFloat(
+                    R.styleable.VectorDrawablePath_trimPathOffset, mTrimPathOffset);
+            mTrimPathStart = a.getFloat(
+                    R.styleable.VectorDrawablePath_trimPathStart, mTrimPathStart);
+
+            updateColorAlphas();
+        }
+
+        @Override
+        public void applyTheme(Theme t) {
+            if (mThemeAttrs == null) {
+                return;
+            }
+
+            final TypedArray a = t.resolveAttributes(mThemeAttrs,
+                    R.styleable.VectorDrawablePath);
+            updateStateFromTypedArray(a);
+            a.recycle();
+        }
+
+        private void updateColorAlphas() {
+            if (!Float.isNaN(mFillOpacity)) {
+                mFillColor = applyAlpha(mFillColor, mFillOpacity);
+            }
+
+            if (!Float.isNaN(mStrokeOpacity)) {
+                mStrokeColor = applyAlpha(mStrokeColor, mStrokeOpacity);
             }
         }
 
+        /* Setters and Getters, used by animator from AnimatedVectorDrawable. */
         @SuppressWarnings("unused")
         int getStroke() {
             return mStrokeColor;
@@ -1261,69 +1438,5 @@
         void setTrimPathOffset(float trimPathOffset) {
             mTrimPathOffset = trimPathOffset;
         }
-
-        public boolean canApplyTheme() {
-            return mThemeAttrs != null;
-        }
-
-        public void inflate(Resources r, AttributeSet attrs, Theme theme) {
-            final TypedArray a = obtainAttributes(r, theme, attrs, R.styleable.VectorDrawablePath);
-            updateStateFromTypedArray(a);
-            a.recycle();
-        }
-
-        private void updateStateFromTypedArray(TypedArray a) {
-            // Account for any configuration changes.
-            mChangingConfigurations |= a.getChangingConfigurations();
-
-            // Extract the theme attributes, if any.
-            mThemeAttrs = a.extractThemeAttrs();
-
-            mClip = a.getBoolean(R.styleable.VectorDrawablePath_clipToPath, mClip);
-
-            mPathName = a.getString(R.styleable.VectorDrawablePath_name);
-            mNodes = PathParser.createNodesFromPathData(a.getString(
-                    R.styleable.VectorDrawablePath_pathData));
-
-            mFillColor = a.getColor(R.styleable.VectorDrawablePath_fill, mFillColor);
-            mFillOpacity = a.getFloat(R.styleable.VectorDrawablePath_fillOpacity, mFillOpacity);
-            mStrokeLineCap = getStrokeLineCap(a.getInt(
-                    R.styleable.VectorDrawablePath_strokeLineCap, -1), mStrokeLineCap);
-            mStrokeLineJoin = getStrokeLineJoin(a.getInt(
-                    R.styleable.VectorDrawablePath_strokeLineJoin, -1), mStrokeLineJoin);
-            mStrokeMiterlimit = a.getFloat(
-                    R.styleable.VectorDrawablePath_strokeMiterLimit, mStrokeMiterlimit);
-            mStrokeColor = a.getColor(R.styleable.VectorDrawablePath_stroke, mStrokeColor);
-            mStrokeOpacity = a.getFloat(
-                    R.styleable.VectorDrawablePath_strokeOpacity, mStrokeOpacity);
-            mStrokeWidth = a.getFloat(R.styleable.VectorDrawablePath_strokeWidth, mStrokeWidth);
-            mTrimPathEnd = a.getFloat(R.styleable.VectorDrawablePath_trimPathEnd, mTrimPathEnd);
-            mTrimPathOffset = a.getFloat(
-                    R.styleable.VectorDrawablePath_trimPathOffset, mTrimPathOffset);
-            mTrimPathStart = a.getFloat(
-                    R.styleable.VectorDrawablePath_trimPathStart, mTrimPathStart);
-
-            updateColorAlphas();
-        }
-
-        public void applyTheme(Theme t) {
-            if (mThemeAttrs == null) {
-                return;
-            }
-
-            final TypedArray a = t.resolveAttributes(mThemeAttrs, R.styleable.VectorDrawablePath);
-            updateStateFromTypedArray(a);
-            a.recycle();
-        }
-
-        private void updateColorAlphas() {
-            if (!Float.isNaN(mFillOpacity)) {
-                mFillColor = applyAlpha(mFillColor, mFillOpacity);
-            }
-
-            if (!Float.isNaN(mStrokeOpacity)) {
-                mStrokeColor = applyAlpha(mStrokeColor, mStrokeOpacity);
-            }
-        }
     }
 }
diff --git a/libs/hwui/OpenGLRenderer.cpp b/libs/hwui/OpenGLRenderer.cpp
index 64df6c8..41f89c2 100755
--- a/libs/hwui/OpenGLRenderer.cpp
+++ b/libs/hwui/OpenGLRenderer.cpp
@@ -1934,7 +1934,9 @@
         return deferredList.flush(*this, dirty) | status;
     }
 
-    return DrawGlInfo::kStatusDone;
+    // Even if there is no drawing command(Ex: invisible),
+    // it still needs startFrame to clear buffer and start tiling.
+    return startFrame();
 }
 
 void OpenGLRenderer::drawAlphaBitmap(Texture* texture, float left, float top, const SkPaint* paint) {
diff --git a/media/java/android/media/CamcorderProfile.java b/media/java/android/media/CamcorderProfile.java
index f9e49c1..8883d28 100644
--- a/media/java/android/media/CamcorderProfile.java
+++ b/media/java/android/media/CamcorderProfile.java
@@ -149,6 +149,39 @@
     private static final int QUALITY_TIME_LAPSE_LIST_END = QUALITY_TIME_LAPSE_2160P;
 
     /**
+     * High speed ( >= 100fps) quality level corresponding to the lowest available resolution.
+     */
+    public static final int QUALITY_HIGH_SPEED_LOW = 2000;
+
+    /**
+     * High speed ( >= 100fps) quality level corresponding to the highest available resolution.
+     */
+    public static final int QUALITY_HIGH_SPEED_HIGH = 2001;
+
+    /**
+     * High speed ( >= 100fps) quality level corresponding to the 480p (720 x 480) resolution.
+     *
+     * Note that the horizontal resolution for 480p can also be other
+     * values, such as 640 or 704, instead of 720.
+     */
+    public static final int QUALITY_HIGH_SPEED_480P = 2002;
+
+    /**
+     * High speed ( >= 100fps) quality level corresponding to the 720p (1280 x 720) resolution.
+     */
+    public static final int QUALITY_HIGH_SPEED_720P = 2003;
+
+    /**
+     * High speed ( >= 100fps) quality level corresponding to the 1080p (1920 x 1080 or 1920x1088)
+     * resolution.
+     */
+    public static final int QUALITY_HIGH_SPEED_1080P = 2004;
+
+    // Start and end of high speed quality list
+    private static final int QUALITY_HIGH_SPEED_LIST_START = QUALITY_HIGH_SPEED_LOW;
+    private static final int QUALITY_HIGH_SPEED_LIST_END = QUALITY_HIGH_SPEED_1080P;
+
+    /**
      * Default recording duration in seconds before the session is terminated.
      * This is useful for applications like MMS has limited file size requirement.
      */
@@ -240,13 +273,17 @@
      * {@link #hasProfile(int, int)}.
      * QUALITY_LOW refers to the lowest quality available, while QUALITY_HIGH refers to
      * the highest quality available.
-     * QUALITY_LOW/QUALITY_HIGH have to match one of qcif, cif, 480p, 720p, or 1080p.
-     * E.g. if the device supports 480p, 720p, and 1080p, then low is 480p and high is
-     * 1080p.
+     * QUALITY_LOW/QUALITY_HIGH have to match one of qcif, cif, 480p, 720p, 1080p or 2160p.
+     * E.g. if the device supports 480p, 720p, 1080p and 2160p, then low is 480p and high is
+     * 2160p.
      *
      * The same is true for time lapse quality levels, i.e. QUALITY_TIME_LAPSE_LOW,
      * QUALITY_TIME_LAPSE_HIGH are guaranteed to be supported and have to match one of
-     * qcif, cif, 480p, 720p, or 1080p.
+     * qcif, cif, 480p, 720p, 1080p, or 2160p.
+     *
+     * For high speed quality levels, they may or may not be supported. If a subset of the levels
+     * are supported, QUALITY_HIGH_SPEED_LOW and QUALITY_HIGH_SPEED_HIGH are guaranteed to be
+     * supported and have to match one of 480p, 720p, or 1080p.
      *
      * A camcorder recording session with higher quality level usually has higher output
      * bit rate, better video and/or audio recording quality, larger video frame
@@ -262,6 +299,7 @@
      * @see #QUALITY_480P
      * @see #QUALITY_720P
      * @see #QUALITY_1080P
+     * @see #QUALITY_2160P
      * @see #QUALITY_TIME_LAPSE_LOW
      * @see #QUALITY_TIME_LAPSE_HIGH
      * @see #QUALITY_TIME_LAPSE_QCIF
@@ -269,12 +307,20 @@
      * @see #QUALITY_TIME_LAPSE_480P
      * @see #QUALITY_TIME_LAPSE_720P
      * @see #QUALITY_TIME_LAPSE_1080P
-     */
+     * @see #QUALITY_TIME_LAPSE_2160P
+     * @see #QUALITY_HIGH_SPEED_LOW
+     * @see #QUALITY_HIGH_SPEED_HIGH
+     * @see #QUALITY_HIGH_SPEED_480P
+     * @see #QUALITY_HIGH_SPEED_720P
+     * @see #QUALITY_HIGH_SPEED_1080P
+    */
     public static CamcorderProfile get(int cameraId, int quality) {
         if (!((quality >= QUALITY_LIST_START &&
                quality <= QUALITY_LIST_END) ||
               (quality >= QUALITY_TIME_LAPSE_LIST_START &&
-               quality <= QUALITY_TIME_LAPSE_LIST_END))) {
+               quality <= QUALITY_TIME_LAPSE_LIST_END) ||
+               (quality >= QUALITY_HIGH_SPEED_LIST_START &&
+               quality <= QUALITY_HIGH_SPEED_LIST_END))) {
             String errMessage = "Unsupported quality level: " + quality;
             throw new IllegalArgumentException(errMessage);
         }
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index f84c383..275d9b2 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -16,7 +16,10 @@
 
 package android.media;
 
+import android.graphics.ImageFormat;
+import android.graphics.Rect;
 import android.media.Image;
+import android.media.Image.Plane;
 import android.media.MediaCodecInfo;
 import android.media.MediaCodecList;
 import android.media.MediaCrypto;
@@ -29,6 +32,7 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.ReadOnlyBufferException;
 import java.util.Arrays;
 import java.util.Map;
 
@@ -1537,4 +1541,175 @@
     }
 
     private long mNativeContext;
+
+    /** @hide */
+    public static class MediaImage extends Image {
+        private final boolean mIsReadOnly;
+        private boolean mIsValid;
+        private final int mWidth;
+        private final int mHeight;
+        private final int mFormat;
+        private long mTimestamp;
+        private final Plane[] mPlanes;
+        private final ByteBuffer mBuffer;
+        private final ByteBuffer mInfo;
+        private final int mXOffset;
+        private final int mYOffset;
+
+        private final static int TYPE_YUV = 1;
+
+        public int getFormat() {
+            checkValid();
+            return mFormat;
+        }
+
+        public int getHeight() {
+            checkValid();
+            return mHeight;
+        }
+
+        public int getWidth() {
+            checkValid();
+            return mWidth;
+        }
+
+        public long getTimestamp() {
+            checkValid();
+            return mTimestamp;
+        }
+
+        public Plane[] getPlanes() {
+            checkValid();
+            return Arrays.copyOf(mPlanes, mPlanes.length);
+        }
+
+        public void close() {
+            if (mIsValid) {
+                java.nio.NioUtils.freeDirectBuffer(mBuffer);
+                mIsValid = false;
+            }
+        }
+
+        /**
+         * Set the crop rectangle associated with this frame.
+         * <p>
+         * The crop rectangle specifies the region of valid pixels in the image,
+         * using coordinates in the largest-resolution plane.
+         */
+        public void setCropRect(Rect cropRect) {
+            if (mIsReadOnly) {
+                throw new ReadOnlyBufferException();
+            }
+            super.setCropRect(cropRect);
+        }
+
+        private void checkValid() {
+            if (!mIsValid) {
+                throw new IllegalStateException("Image is already released");
+            }
+        }
+
+        private int readInt(ByteBuffer buffer, boolean asLong) {
+            if (asLong) {
+                return (int)buffer.getLong();
+            } else {
+                return buffer.getInt();
+            }
+        }
+
+        public MediaImage(
+                ByteBuffer buffer, ByteBuffer info, boolean readOnly,
+                long timestamp, int xOffset, int yOffset, Rect cropRect) {
+            mFormat = ImageFormat.YUV_420_888;
+            mTimestamp = timestamp;
+            mIsValid = true;
+            mIsReadOnly = buffer.isReadOnly();
+            mBuffer = buffer.duplicate();
+            if (cropRect != null) {
+                cropRect.offset(-xOffset, -yOffset);
+            }
+            mCropRect = cropRect;
+
+            // save offsets and info
+            mXOffset = xOffset;
+            mYOffset = yOffset;
+            mInfo = info;
+
+            // read media-info.  the size of media info can be 80 or 156 depending on
+            // whether it was created on a 32- or 64-bit process.  See MediaImage
+            if (info.remaining() == 80 || info.remaining() == 156) {
+                boolean sizeIsLong = info.remaining() == 156;
+                int type = info.getInt();
+                if (type != TYPE_YUV) {
+                    throw new UnsupportedOperationException("unsupported type: " + type);
+                }
+                int numPlanes = readInt(info, sizeIsLong);
+                if (numPlanes != 3) {
+                    throw new RuntimeException("unexpected number of planes: " + numPlanes);
+                }
+                mWidth = readInt(info, sizeIsLong);
+                mHeight = readInt(info, sizeIsLong);
+                if (mWidth < 1 || mHeight < 1) {
+                    throw new UnsupportedOperationException(
+                            "unsupported size: " + mWidth + "x" + mHeight);
+                }
+                int bitDepth = readInt(info, sizeIsLong);
+                if (bitDepth != 8) {
+                    throw new UnsupportedOperationException("unsupported bit depth: " + bitDepth);
+                }
+                mPlanes = new MediaPlane[numPlanes];
+                for (int ix = 0; ix < numPlanes; ix++) {
+                    int planeOffset = readInt(info, sizeIsLong);
+                    int colInc = readInt(info, sizeIsLong);
+                    int rowInc = readInt(info, sizeIsLong);
+                    int horiz = readInt(info, sizeIsLong);
+                    int vert = readInt(info, sizeIsLong);
+                    if (horiz != vert || horiz != (ix == 0 ? 1 : 2)) {
+                        throw new UnsupportedOperationException("unexpected subsampling: "
+                                + horiz + "x" + vert + " on plane " + ix);
+                    }
+
+                    buffer.clear();
+                    buffer.position(mBuffer.position() + planeOffset
+                            + (xOffset / horiz) * colInc + (yOffset / vert) * rowInc);
+                    buffer.limit(buffer.position() + Utils.divUp(bitDepth, 8)
+                            + (mHeight / vert - 1) * rowInc + (mWidth / horiz - 1) * colInc);
+                    mPlanes[ix] = new MediaPlane(buffer.slice(), rowInc, colInc);
+                }
+            } else {
+                throw new UnsupportedOperationException(
+                        "unsupported info length: " + info.remaining());
+            }
+        }
+
+        private class MediaPlane extends Plane {
+            public MediaPlane(ByteBuffer buffer, int rowInc, int colInc) {
+                mData = buffer;
+                mRowInc = rowInc;
+                mColInc = colInc;
+            }
+
+            @Override
+            public int getRowStride() {
+                checkValid();
+                return mRowInc;
+            }
+
+            @Override
+            public int getPixelStride() {
+                checkValid();
+                return mColInc;
+            }
+
+            @Override
+            public ByteBuffer getBuffer() {
+                checkValid();
+                return mData;
+            }
+
+            private final int mRowInc;
+            private final int mColInc;
+            private final ByteBuffer mData;
+        }
+    }
 }
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index 35a68a4..9fb552c 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -147,7 +147,7 @@
                 return;
             }
             case DO_REQUEST_UNBLOCK_CONTENT: {
-                mTvInputSessionImpl.requestUnblockContent((String) msg.obj);
+                mTvInputSessionImpl.unblockContent((String) msg.obj);
                 return;
             }
             default: {
diff --git a/media/java/android/media/tv/TvInputPassthroughWrapperService.java b/media/java/android/media/tv/TvInputPassthroughWrapperService.java
index e99044d..08c802f6 100644
--- a/media/java/android/media/tv/TvInputPassthroughWrapperService.java
+++ b/media/java/android/media/tv/TvInputPassthroughWrapperService.java
@@ -170,7 +170,7 @@
             public void onSessionEvent(TvInputManager.Session session, String eventType,
                     Bundle eventArgs) {
                 if (mSession == session) {
-                    dispatchSessionEvent(eventType, eventArgs);
+                    notifySessionEvent(eventType, eventArgs);
                 }
             }
         };
@@ -188,13 +188,13 @@
 
         /**
          * Called when the underlying pass-through TV input session calls
-         * {@link #dispatchVideoAvailable()}.
+         * {@link #notifyVideoAvailable()}.
          */
         public abstract void onPassthroughVideoAvailable();
 
         /**
          * Called when the underlying pass-through TV input session calls
-         * {@link #dispatchVideoUnavailable(int)}.
+         * {@link #notifyVideoUnavailable(int)}.
          *
          * @param reason The reason why the pass-through TV input stopped the playback.
          */
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index d5111f4..6b0a633 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -282,7 +282,7 @@
          * @param eventArgs Optional arguments of the event.
          * @hide
          */
-        public void dispatchSessionEvent(final String eventType, final Bundle eventArgs) {
+        public void notifySessionEvent(final String eventType, final Bundle eventArgs) {
             if (eventType == null) {
                 throw new IllegalArgumentException("eventType should not be null.");
             }
@@ -290,7 +290,7 @@
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchSessionEvent(" + eventType + ")");
+                        if (DEBUG) Log.d(TAG, "notifySessionEvent(" + eventType + ")");
                         mSessionCallback.onSessionEvent(eventType, eventArgs);
                     } catch (RemoteException e) {
                         Log.w(TAG, "error in sending event (event=" + eventType + ")");
@@ -304,15 +304,15 @@
          *
          * @param channelUri The URI of a channel.
          */
-        public void dispatchChannelRetuned(final Uri channelUri) {
+        public void notifyChannelRetuned(final Uri channelUri) {
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchChannelRetuned");
+                        if (DEBUG) Log.d(TAG, "notifyChannelRetuned");
                         mSessionCallback.onChannelRetuned(channelUri);
                     } catch (RemoteException e) {
-                        Log.w(TAG, "error in dispatchChannelRetuned");
+                        Log.w(TAG, "error in notifyChannelRetuned");
                     }
                 }
             });
@@ -324,7 +324,7 @@
          *
          * @param tracks A list which includes track information.
          */
-        public void dispatchTrackInfoChanged(final List<TvTrackInfo> tracks) {
+        public void notifyTrackInfoChanged(final List<TvTrackInfo> tracks) {
             if (!TvTrackInfo.checkSanity(tracks)) {
                 throw new IllegalArgumentException(
                         "Two or more selected tracks for a track type.");
@@ -333,10 +333,10 @@
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchTrackInfoChanged");
+                        if (DEBUG) Log.d(TAG, "notifyTrackInfoChanged");
                         mSessionCallback.onTrackInfoChanged(tracks);
                     } catch (RemoteException e) {
-                        Log.w(TAG, "error in dispatchTrackInfoChanged");
+                        Log.w(TAG, "error in notifyTrackInfoChanged");
                     }
                 }
             });
@@ -346,15 +346,15 @@
          * Informs the application that video is available and the playback of the TV stream has
          * been started.
          */
-        public void dispatchVideoAvailable() {
+        public void notifyVideoAvailable() {
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchVideoAvailable");
+                        if (DEBUG) Log.d(TAG, "notifyVideoAvailable");
                         mSessionCallback.onVideoAvailable();
                     } catch (RemoteException e) {
-                        Log.w(TAG, "error in dispatchVideoAvailable");
+                        Log.w(TAG, "error in notifyVideoAvailable");
                     }
                 }
             });
@@ -372,7 +372,7 @@
          * <li>{@link TvInputManager#VIDEO_UNAVAILABLE_REASON_BUFFERING}
          * </ul>
          */
-        public void dispatchVideoUnavailable(final int reason) {
+        public void notifyVideoUnavailable(final int reason) {
             if (reason < TvInputManager.VIDEO_UNAVAILABLE_REASON_START
                     || reason > TvInputManager.VIDEO_UNAVAILABLE_REASON_END) {
                 throw new IllegalArgumentException("Unknown reason: " + reason);
@@ -381,10 +381,10 @@
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchVideoUnavailable");
+                        if (DEBUG) Log.d(TAG, "notifyVideoUnavailable");
                         mSessionCallback.onVideoUnavailable(reason);
                     } catch (RemoteException e) {
-                        Log.w(TAG, "error in dispatchVideoUnavailable");
+                        Log.w(TAG, "error in notifyVideoUnavailable");
                     }
                 }
             });
@@ -411,18 +411,18 @@
          * reevaluate the current program with the new parental control settings.
          * </p>
          *
-         * @see #dispatchContentBlocked
+         * @see #notifyContentBlocked
          * @see TvParentalControlManager
          */
-        public void dispatchContentAllowed() {
+        public void notifyContentAllowed() {
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchContentAllowed");
+                        if (DEBUG) Log.d(TAG, "notifyContentAllowed");
                         mSessionCallback.onContentAllowed();
                     } catch (RemoteException e) {
-                        Log.w(TAG, "error in dispatchContentAllowed");
+                        Log.w(TAG, "error in notifyContentAllowed");
                     }
                 }
             });
@@ -451,18 +451,18 @@
          * </p>
          *
          * @param rating The content rating for the current TV program.
-         * @see #dispatchContentAllowed
+         * @see #notifyContentAllowed
          * @see TvParentalControlManager
          */
-        public void dispatchContentBlocked(final TvContentRating rating) {
+        public void notifyContentBlocked(final TvContentRating rating) {
             mHandler.post(new Runnable() {
                 @Override
                 public void run() {
                     try {
-                        if (DEBUG) Log.d(TAG, "dispatchContentBlocked");
+                        if (DEBUG) Log.d(TAG, "notifyContentBlocked");
                         mSessionCallback.onContentBlocked(rating.flattenToString());
                     } catch (RemoteException e) {
-                        Log.w(TAG, "error in dispatchContentBlocked");
+                        Log.w(TAG, "error in notifyContentBlocked");
                     }
                 }
             });
@@ -529,8 +529,8 @@
         public abstract void onSetStreamVolume(float volume);
 
         /**
-         * Tunes to a given channel. When the video is available, {@link #dispatchVideoAvailable()}
-         * should be called. Also, {@link #dispatchVideoUnavailable(int)} should be called when the
+         * Tunes to a given channel. When the video is available, {@link #notifyVideoAvailable()}
+         * should be called. Also, {@link #notifyVideoUnavailable(int)} should be called when the
          * TV input cannot continue playing the given channel.
          *
          * @param channelUri The URI of the channel.
@@ -562,7 +562,7 @@
          *
          * @param unblockedRating An unblocked content rating
          */
-        public void onRequestUnblockContent(TvContentRating unblockedRating) {
+        public void onUnblockContent(TvContentRating unblockedRating) {
         }
 
         /**
@@ -571,12 +571,12 @@
          * If it is called multiple times on the same type of track (ie. Video, Audio, Text), the
          * track selected previously should be unselected in the implementation of this method.
          * Also, if the select operation was successful, the implementation should call
-         * {@link #dispatchTrackInfoChanged(List)} to report the updated track information.
+         * {@link #notifyTrackInfoChanged(List)} to report the updated track information.
          * </p>
          *
          * @param track The track to be selected.
          * @return {@code true} if the select operation was successful, {@code false} otherwise.
-         * @see #dispatchTrackInfoChanged
+         * @see #notifyTrackInfoChanged
          * @see TvTrackInfo#KEY_IS_SELECTED
          */
         public boolean onSelectTrack(TvTrackInfo track) {
@@ -587,12 +587,12 @@
          * Unselects a given track.
          * <p>
          * If the unselect operation was successful, the implementation should call
-         * {@link #dispatchTrackInfoChanged(List)} to report the updated track information.
+         * {@link #notifyTrackInfoChanged(List)} to report the updated track information.
          * </p>
          *
          * @param track The track to be unselected.
          * @return {@code true} if the unselect operation was successful, {@code false} otherwise.
-         * @see #dispatchTrackInfoChanged
+         * @see #notifyTrackInfoChanged
          * @see TvTrackInfo#KEY_IS_SELECTED
          */
         public boolean onUnselectTrack(TvTrackInfo track) {
@@ -821,10 +821,10 @@
         }
 
         /**
-         * Calls {@link #onRequestUnblockContent}.
+         * Calls {@link #onUnblockContent}.
          */
-        void requestUnblockContent(String unblockedRating) {
-            onRequestUnblockContent(TvContentRating.unflattenFromString(unblockedRating));
+        void unblockContent(String unblockedRating) {
+            onUnblockContent(TvContentRating.unflattenFromString(unblockedRating));
             // TODO: Handle failure.
         }
 
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 5fe9955..a5eef0a 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -258,7 +258,7 @@
      * </p>
      *
      * @param unblockedRating A TvContentRating to unblock.
-     * @see TvInputService.Session#dispatchContentBlocked(TvContentRating)
+     * @see TvInputService.Session#notifyContentBlocked(TvContentRating)
      * @hide
      */
     @SystemApi
@@ -484,8 +484,8 @@
     }
 
     @Override
-    public void setVisibility(int visibility) {
-        super.setVisibility(visibility);
+    protected void onVisibilityChanged(View changedView, int visibility) {
+        super.onVisibilityChanged(changedView, visibility);
         mSurfaceView.setVisibility(visibility);
         if (visibility == View.VISIBLE) {
             createSessionOverlayView();
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index 04ff098..d033f76 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -90,6 +90,8 @@
     mClass = (jclass)env->NewGlobalRef(clazz);
     mObject = env->NewWeakGlobalRef(thiz);
 
+    cacheJavaObjects(env);
+
     mLooper = new ALooper;
     mLooper->setName("MediaCodec_looper");
 
@@ -105,6 +107,45 @@
     }
 }
 
+void JMediaCodec::cacheJavaObjects(JNIEnv *env) {
+    jclass clazz = (jclass)env->FindClass("java/nio/ByteBuffer");
+    mByteBufferClass = (jclass)env->NewGlobalRef(clazz);
+    CHECK(mByteBufferClass != NULL);
+
+    ScopedLocalRef<jclass> byteOrderClass(
+            env, env->FindClass("java/nio/ByteOrder"));
+    CHECK(byteOrderClass.get() != NULL);
+
+    jmethodID nativeOrderID = env->GetStaticMethodID(
+            byteOrderClass.get(), "nativeOrder", "()Ljava/nio/ByteOrder;");
+    CHECK(nativeOrderID != NULL);
+
+    jobject nativeByteOrderObj =
+        env->CallStaticObjectMethod(byteOrderClass.get(), nativeOrderID);
+    mNativeByteOrderObj = env->NewGlobalRef(nativeByteOrderObj);
+    CHECK(mNativeByteOrderObj != NULL);
+    env->DeleteLocalRef(nativeByteOrderObj);
+    nativeByteOrderObj = NULL;
+
+    mByteBufferOrderMethodID = env->GetMethodID(
+            mByteBufferClass,
+            "order",
+            "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;");
+    CHECK(mByteBufferOrderMethodID != NULL);
+
+    mByteBufferAsReadOnlyBufferMethodID = env->GetMethodID(
+            mByteBufferClass, "asReadOnlyBuffer", "()Ljava/nio/ByteBuffer;");
+    CHECK(mByteBufferAsReadOnlyBufferMethodID != NULL);
+
+    mByteBufferPositionMethodID = env->GetMethodID(
+            mByteBufferClass, "position", "(I)Ljava/nio/Buffer;");
+    CHECK(mByteBufferPositionMethodID != NULL);
+
+    mByteBufferLimitMethodID = env->GetMethodID(
+            mByteBufferClass, "limit", "(I)Ljava/nio/Buffer;");
+    CHECK(mByteBufferLimitMethodID != NULL);
+}
+
 status_t JMediaCodec::initCheck() const {
     return mCodec != NULL ? OK : NO_INIT;
 }
@@ -148,6 +189,19 @@
     mObject = NULL;
     env->DeleteGlobalRef(mClass);
     mClass = NULL;
+    deleteJavaObjects(env);
+}
+
+void JMediaCodec::deleteJavaObjects(JNIEnv *env) {
+    env->DeleteGlobalRef(mByteBufferClass);
+    mByteBufferClass = NULL;
+    env->DeleteGlobalRef(mNativeByteOrderObj);
+    mNativeByteOrderObj = NULL;
+
+    mByteBufferOrderMethodID = NULL;
+    mByteBufferAsReadOnlyBufferMethodID = NULL;
+    mByteBufferPositionMethodID = NULL;
+    mByteBufferLimitMethodID = NULL;
 }
 
 status_t JMediaCodec::setCallback(jobject cb) {
@@ -298,80 +352,69 @@
         return err;
     }
 
-    ScopedLocalRef<jclass> byteBufferClass(
-            env, env->FindClass("java/nio/ByteBuffer"));
-
-    CHECK(byteBufferClass.get() != NULL);
-
-    jmethodID orderID = env->GetMethodID(
-            byteBufferClass.get(),
-            "order",
-            "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;");
-
-    CHECK(orderID != NULL);
-
-    jmethodID asReadOnlyBufferID = env->GetMethodID(
-            byteBufferClass.get(), "asReadOnlyBuffer", "()Ljava/nio/ByteBuffer;");
-
-    CHECK(asReadOnlyBufferID != NULL);
-
-    ScopedLocalRef<jclass> byteOrderClass(
-            env, env->FindClass("java/nio/ByteOrder"));
-
-    CHECK(byteOrderClass.get() != NULL);
-
-    jmethodID nativeOrderID = env->GetStaticMethodID(
-            byteOrderClass.get(), "nativeOrder", "()Ljava/nio/ByteOrder;");
-    CHECK(nativeOrderID != NULL);
-
-    jobject nativeByteOrderObj =
-        env->CallStaticObjectMethod(byteOrderClass.get(), nativeOrderID);
-    CHECK(nativeByteOrderObj != NULL);
-
     *bufArray = (jobjectArray)env->NewObjectArray(
-            buffers.size(), byteBufferClass.get(), NULL);
+            buffers.size(), mByteBufferClass, NULL);
     if (*bufArray == NULL) {
-        env->DeleteLocalRef(nativeByteOrderObj);
         return NO_MEMORY;
     }
 
     for (size_t i = 0; i < buffers.size(); ++i) {
         const sp<ABuffer> &buffer = buffers.itemAt(i);
 
-        // if this is an ABuffer that doesn't actually hold any accessible memory,
-        // use a null ByteBuffer
-        if (buffer->base() == NULL) {
-            continue;
+        jobject byteBuffer = NULL;
+        err = createByteBufferFromABuffer(
+                env, !input /* readOnly */, true /* clearBuffer */, buffer, &byteBuffer);
+        if (err != OK) {
+            return err;
         }
-        jobject byteBuffer =
-            env->NewDirectByteBuffer(
-                buffer->base(),
-                buffer->capacity());
-        if (!input && byteBuffer != NULL) {
-            jobject readOnlyBuffer = env->CallObjectMethod(
-                    byteBuffer, asReadOnlyBufferID);
+        if (byteBuffer != NULL) {
+            env->SetObjectArrayElement(
+                    *bufArray, i, byteBuffer);
+
             env->DeleteLocalRef(byteBuffer);
-            byteBuffer = readOnlyBuffer;
+            byteBuffer = NULL;
         }
-        if (byteBuffer == NULL) {
-            env->DeleteLocalRef(nativeByteOrderObj);
-            return NO_MEMORY;
-        }
-        jobject me = env->CallObjectMethod(
-                byteBuffer, orderID, nativeByteOrderObj);
-        env->DeleteLocalRef(me);
-        me = NULL;
-
-        env->SetObjectArrayElement(
-                *bufArray, i, byteBuffer);
-
-        env->DeleteLocalRef(byteBuffer);
-        byteBuffer = NULL;
     }
 
-    env->DeleteLocalRef(nativeByteOrderObj);
-    nativeByteOrderObj = NULL;
+    return OK;
+}
 
+// static
+status_t JMediaCodec::createByteBufferFromABuffer(
+        JNIEnv *env, bool readOnly, bool clearBuffer, const sp<ABuffer> &buffer,
+        jobject *buf) const {
+    // if this is an ABuffer that doesn't actually hold any accessible memory,
+    // use a null ByteBuffer
+    *buf = NULL;
+    if (buffer->base() == NULL) {
+        return OK;
+    }
+
+    jobject byteBuffer =
+        env->NewDirectByteBuffer(buffer->base(), buffer->capacity());
+    if (readOnly && byteBuffer != NULL) {
+        jobject readOnlyBuffer = env->CallObjectMethod(
+                byteBuffer, mByteBufferAsReadOnlyBufferMethodID);
+        env->DeleteLocalRef(byteBuffer);
+        byteBuffer = readOnlyBuffer;
+    }
+    if (byteBuffer == NULL) {
+        return NO_MEMORY;
+    }
+    jobject me = env->CallObjectMethod(
+            byteBuffer, mByteBufferOrderMethodID, mNativeByteOrderObj);
+    env->DeleteLocalRef(me);
+    me = env->CallObjectMethod(
+            byteBuffer, mByteBufferLimitMethodID,
+            clearBuffer ? buffer->capacity() : (buffer->offset() + buffer->size()));
+    env->DeleteLocalRef(me);
+    me = env->CallObjectMethod(
+            byteBuffer, mByteBufferPositionMethodID,
+            clearBuffer ? 0 : buffer->offset());
+    env->DeleteLocalRef(me);
+    me = NULL;
+
+    *buf = byteBuffer;
     return OK;
 }
 
@@ -388,85 +431,8 @@
         return err;
     }
 
-    ScopedLocalRef<jclass> byteBufferClass(
-            env, env->FindClass("java/nio/ByteBuffer"));
-
-    CHECK(byteBufferClass.get() != NULL);
-
-    jmethodID orderID = env->GetMethodID(
-            byteBufferClass.get(),
-            "order",
-            "(Ljava/nio/ByteOrder;)Ljava/nio/ByteBuffer;");
-
-    CHECK(orderID != NULL);
-
-    jmethodID asReadOnlyBufferID = env->GetMethodID(
-            byteBufferClass.get(), "asReadOnlyBuffer", "()Ljava/nio/ByteBuffer;");
-
-    CHECK(asReadOnlyBufferID != NULL);
-
-    jmethodID positionID = env->GetMethodID(
-            byteBufferClass.get(), "position", "(I)Ljava/nio/Buffer;");
-
-    CHECK(positionID != NULL);
-
-    jmethodID limitID = env->GetMethodID(
-            byteBufferClass.get(), "limit", "(I)Ljava/nio/Buffer;");
-
-    CHECK(limitID != NULL);
-
-    ScopedLocalRef<jclass> byteOrderClass(
-            env, env->FindClass("java/nio/ByteOrder"));
-
-    CHECK(byteOrderClass.get() != NULL);
-
-    jmethodID nativeOrderID = env->GetStaticMethodID(
-            byteOrderClass.get(), "nativeOrder", "()Ljava/nio/ByteOrder;");
-    CHECK(nativeOrderID != NULL);
-
-    jobject nativeByteOrderObj =
-        env->CallStaticObjectMethod(byteOrderClass.get(), nativeOrderID);
-    CHECK(nativeByteOrderObj != NULL);
-
-    // if this is an ABuffer that doesn't actually hold any accessible memory,
-    // use a null ByteBuffer
-    if (buffer->base() == NULL) {
-        *buf = NULL;
-        return OK;
-    }
-
-    jobject byteBuffer =
-        env->NewDirectByteBuffer(
-            buffer->base(),
-            buffer->capacity());
-    if (!input && byteBuffer != NULL) {
-        jobject readOnlyBuffer = env->CallObjectMethod(
-                byteBuffer, asReadOnlyBufferID);
-        env->DeleteLocalRef(byteBuffer);
-        byteBuffer = readOnlyBuffer;
-    }
-    if (byteBuffer == NULL) {
-        env->DeleteLocalRef(nativeByteOrderObj);
-        return NO_MEMORY;
-    }
-    jobject me = env->CallObjectMethod(
-            byteBuffer, orderID, nativeByteOrderObj);
-    env->DeleteLocalRef(me);
-    me = env->CallObjectMethod(
-            byteBuffer, limitID,
-            input ? buffer->capacity() : (buffer->offset() + buffer->size()));
-    env->DeleteLocalRef(me);
-    me = env->CallObjectMethod(
-            byteBuffer, positionID,
-            input ? 0 : buffer->offset());
-    env->DeleteLocalRef(me);
-    me = NULL;
-
-    env->DeleteLocalRef(nativeByteOrderObj);
-    nativeByteOrderObj = NULL;
-
-    *buf = byteBuffer;
-    return OK;
+    return createByteBufferFromABuffer(
+            env, !input /* readOnly */, input /* clearBuffer */, buffer, buf);
 }
 
 status_t JMediaCodec::getImage(
@@ -490,15 +456,80 @@
     }
 
     // check if buffer is an image
-    AString imageData;
-    if (!buffer->meta()->findString("image-data", &imageData)) {
+    sp<ABuffer> imageData;
+    if (!buffer->meta()->findBuffer("image-data", &imageData)) {
         return OK;
     }
 
+    int64_t timestamp = 0;
+    if (!input && buffer->meta()->findInt64("timeUs", &timestamp)) {
+        timestamp *= 1000; // adjust to ns
+    }
+
+    jobject byteBuffer = NULL;
+    err = createByteBufferFromABuffer(
+            env, !input /* readOnly */, input /* clearBuffer */, buffer, &byteBuffer);
+    if (err != OK) {
+        return OK;
+    }
+
+    jobject infoBuffer = NULL;
+    err = createByteBufferFromABuffer(
+            env, true /* readOnly */, true /* clearBuffer */, imageData, &infoBuffer);
+    if (err != OK) {
+        env->DeleteLocalRef(byteBuffer);
+        byteBuffer = NULL;
+        return OK;
+    }
+
+    jobject cropRect = NULL;
+    int32_t left, top, right, bottom;
+    if (buffer->meta()->findRect("crop-rect", &left, &top, &right, &bottom)) {
+        ScopedLocalRef<jclass> rectClazz(
+                env, env->FindClass("android/graphics/Rect"));
+        CHECK(rectClazz.get() != NULL);
+
+        jmethodID rectConstructID = env->GetMethodID(
+                rectClazz.get(), "<init>", "(IIII)V");
+
+        cropRect = env->NewObject(
+                rectClazz.get(), rectConstructID, left, top, right + 1, bottom + 1);
+    }
+
+    ScopedLocalRef<jclass> imageClazz(
+            env, env->FindClass("android/media/MediaCodec$MediaImage"));
+    CHECK(imageClazz.get() != NULL);
+
+    jmethodID imageConstructID = env->GetMethodID(imageClazz.get(), "<init>",
+            "(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;ZJIILandroid/graphics/Rect;)V");
+
+    *buf = env->NewObject(imageClazz.get(), imageConstructID,
+            byteBuffer, infoBuffer,
+            (jboolean)!input /* readOnly */,
+            (jlong)timestamp,
+            (jint)0 /* xOffset */, (jint)0 /* yOffset */, cropRect);
+
+    // if MediaImage creation fails, return null
+    if (env->ExceptionCheck()) {
+        env->ExceptionDescribe();
+        env->ExceptionClear();
+        *buf = NULL;
+    }
+
+    if (cropRect != NULL) {
+        env->DeleteLocalRef(cropRect);
+        cropRect = NULL;
+    }
+
+    env->DeleteLocalRef(byteBuffer);
+    byteBuffer = NULL;
+
+    env->DeleteLocalRef(infoBuffer);
+    infoBuffer = NULL;
+
     return OK;
 }
 
-
 status_t JMediaCodec::getName(JNIEnv *env, jstring *nameStr) const {
     AString name;
 
diff --git a/media/jni/android_media_MediaCodec.h b/media/jni/android_media_MediaCodec.h
index dbccb0f..f84a16a 100644
--- a/media/jni/android_media_MediaCodec.h
+++ b/media/jni/android_media_MediaCodec.h
@@ -26,6 +26,7 @@
 
 namespace android {
 
+struct ABuffer;
 struct ALooper;
 struct AMessage;
 struct AString;
@@ -121,11 +122,26 @@
     jweak mObject;
     sp<Surface> mSurfaceTextureClient;
 
+    // java objects cached
+    jclass mByteBufferClass;
+    jobject mNativeByteOrderObj;
+    jmethodID mByteBufferOrderMethodID;
+    jmethodID mByteBufferPositionMethodID;
+    jmethodID mByteBufferLimitMethodID;
+    jmethodID mByteBufferAsReadOnlyBufferMethodID;
+
     sp<ALooper> mLooper;
     sp<MediaCodec> mCodec;
 
     sp<AMessage> mCallbackNotification;
 
+    status_t createByteBufferFromABuffer(
+            JNIEnv *env, bool readOnly, bool clearBuffer, const sp<ABuffer> &buffer,
+            jobject *buf) const;
+
+    void cacheJavaObjects(JNIEnv *env);
+    void deleteJavaObjects(JNIEnv *env);
+
     DISALLOW_EVIL_CONSTRUCTORS(JMediaCodec);
 };
 
diff --git a/media/jni/android_media_MediaProfiles.cpp b/media/jni/android_media_MediaProfiles.cpp
index 1e5c700..007fc14 100644
--- a/media/jni/android_media_MediaProfiles.cpp
+++ b/media/jni/android_media_MediaProfiles.cpp
@@ -166,7 +166,9 @@
     return ((quality >= CAMCORDER_QUALITY_LIST_START &&
              quality <= CAMCORDER_QUALITY_LIST_END) ||
             (quality >= CAMCORDER_QUALITY_TIME_LAPSE_LIST_START &&
-             quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END));
+             quality <= CAMCORDER_QUALITY_TIME_LAPSE_LIST_END) ||
+             (quality >= CAMCORDER_QUALITY_HIGH_SPEED_LIST_START &&
+              quality <= CAMCORDER_QUALITY_HIGH_SPEED_LIST_END));
 }
 
 static jobject
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am.png
index 7c4c1a6..54d76c1 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_breadcrumb_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png
index 649985d..1330240 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_accept.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png
index 791bf6d..6369d18 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_cancel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png
index 6c32af1..063009d 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_cab_select_item.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png
deleted file mode 100644
index 5bc4e05..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_dark.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_dark.png
new file mode 100644
index 0000000..bea0eec
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_light.png
new file mode 100644
index 0000000..c4c264e
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_alert_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info.png
deleted file mode 100644
index ffb076c..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_dark.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_dark.png
new file mode 100644
index 0000000..f7e59a5
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_light.png
new file mode 100644
index 0000000..ae50d74
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_dialog_info_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album.png
index 179db33..e462727 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_album.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png
index 8704a78..8ac89b6 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_apk.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_am.png
deleted file mode 100644
index 465838d..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_dark_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_dark_am.png
new file mode 100644
index 0000000..3cbff21
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_light_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_light_am.png
new file mode 100644
index 0000000..7c8b540
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_audio_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png
index 434a6e6..8644171 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_certificate.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png
index 940d185..0a3a9a6 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_codes.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png
index 35cdc1f..d37d9bf 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_compressed.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact_am.png
index 8f3b82c..7ad6c37 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_contact_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event_am.png
index a3df893..bb7e584 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_event_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_excel.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_excel.png
new file mode 100644
index 0000000..0f5159b
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_excel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png
index 92225ba..b3e7192 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_font.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_generic_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_generic_am.png
index 55b9b7d..a799a83d 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_generic_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png
deleted file mode 100644
index 72b611d..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image_dark.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image_dark.png
new file mode 100644
index 0000000..10c0b99
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image_light.png
new file mode 100644
index 0000000..c857519
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_image_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png
index e08b0e6..b168481 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_pdf.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_powerpoint.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_powerpoint.png
new file mode 100644
index 0000000..4af36b7
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_powerpoint.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png
index 0c55e8c..9167c7d 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_presentation.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet_am.png
index 880564e..7abe436 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_spreadsheet_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text_am.png
index cb60165..737cca7 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_text_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_am.png
deleted file mode 100644
index 9a942d2..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_dark_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_dark_am.png
new file mode 100644
index 0000000..ff8d3aa
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_light_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_light_am.png
new file mode 100644
index 0000000..d422eb7
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_video_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_doc_word.png b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_word.png
new file mode 100644
index 0000000..3860241
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_doc_word.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_folder.png b/packages/DocumentsUI/res/drawable-hdpi/ic_folder.png
new file mode 100644
index 0000000..3c88982
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png
deleted file mode 100644
index 7c3d69d..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_focused.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_focused.9.png
deleted file mode 100644
index 8b90094..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_pressed.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_pressed.9.png
deleted file mode 100644
index 1e41d7a..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_card_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder.png
index a6e56ea..e9cfdb1 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png
deleted file mode 100644
index b896c55..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_grid_gradient_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_hamburger.png b/packages/DocumentsUI/res/drawable-hdpi/ic_hamburger.png
new file mode 100644
index 0000000..4527667
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_hamburger.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png
index c907bf6..f4f9df2 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_copy.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png
index 1fe7af7..396ce59 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_delete.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am.png
index 8a88407..ddf9f9a 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_disconnect_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am.png
index 638c812..ab4d176 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_new_folder_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow.png
index 2a007d2..6b01137 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_overflow.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am.png
index 2756327..4eeafad 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_rename_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png
index b00328b..dca23e6 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_search.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png
index 03e0cc7..d52840f 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_settings.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png
index cf7d2f4..8ff9ea5 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_share.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am.png
index 0d4cdc1..3563e97 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_sortby_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am.png
index 20dce0f..2d61dc7 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_undo_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png
index 3f3b536..3035ac4 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_grid.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png
index 79bffc9..d1f26a6 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_menu_view_list.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_open_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_open_am.png
index 595c4b9..b0a5f73 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_open_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_open_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am.png
index 3700512..9497fb0b 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_popout_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png
deleted file mode 100644
index 52f1c70..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_dark.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_dark.png
new file mode 100644
index 0000000..96d23be
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_light.png
new file mode 100644
index 0000000..032fb17
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_download_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_am.png
deleted file mode 100644
index 915e118..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_dark_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_dark_am.png
new file mode 100644
index 0000000..e2001f7
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_light_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_light_am.png
new file mode 100644
index 0000000..f2cec4f
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_folder_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png
deleted file mode 100644
index 303b7f9..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_dark.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_dark.png
new file mode 100644
index 0000000..6954b42
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_light.png
new file mode 100644
index 0000000..3ede991
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_recent_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png
deleted file mode 100644
index 2375e17..0000000
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_dark.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_dark.png
new file mode 100644
index 0000000..b43fddd
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_light.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_light.png
new file mode 100644
index 0000000..f0a8402
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_sdcard_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png
index 5c0c87b..665ee0b 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_root_usb.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am.png b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am.png
index 99060cd..6be1f5b 100644
--- a/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-hdpi/ic_subdirectory_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am.png
index 09e77afb..821667e4 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_breadcrumb_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png
index f42be13..4e954c4 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_accept.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png
index b47e306..6ec1234 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_cancel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png
index 903a041..73e1081 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_cab_select_item.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png
deleted file mode 100644
index 4835d5f..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_dark.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_dark.png
new file mode 100644
index 0000000..dbe4cb7
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_light.png
new file mode 100644
index 0000000..e9ae097
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_alert_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info.png
deleted file mode 100644
index 2d29442..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_dark.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_dark.png
new file mode 100644
index 0000000..f8f9eaf
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_light.png
new file mode 100644
index 0000000..f8635fe
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_dialog_info_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album.png
index 318dd5b..0d3d5d7 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_album.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png
index 932995e..f9597f0 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_apk.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_am.png
deleted file mode 100644
index cb94d99..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_dark_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_dark_am.png
new file mode 100644
index 0000000..deba408
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_light_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_light_am.png
new file mode 100644
index 0000000..88f0127
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_audio_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png
index 240d7f4..b1323da 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_certificate.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png
index 6c6aad6..ff99fd7 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_codes.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png
index 8fc7bea..4af71f3 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_compressed.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact_am.png
index 290ad3a..e137ca0 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_contact_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event_am.png
index e5eda72..db55b74 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_event_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_excel.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_excel.png
new file mode 100644
index 0000000..3adff71
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_excel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png
index 00bd478..0a4a841 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_font.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_generic_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_generic_am.png
index a1bd14e..1dce216 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_generic_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png
deleted file mode 100644
index b81b1e5..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image_dark.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image_dark.png
new file mode 100644
index 0000000..f061b0c
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image_light.png
new file mode 100644
index 0000000..fa3d2ea
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_image_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png
index 3381c42..b558d08 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_pdf.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_powerpoint.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_powerpoint.png
new file mode 100644
index 0000000..efc0b13
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_powerpoint.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png
index 68cc971..655d866 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_presentation.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet_am.png
index 2934e5a..a2f9116 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_spreadsheet_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text_am.png
index 95565b3..4aa3a0e 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_text_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_am.png
deleted file mode 100644
index 3a5b798..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_dark_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_dark_am.png
new file mode 100644
index 0000000..1b6f00f
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_light_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_light_am.png
new file mode 100644
index 0000000..24dad11
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_video_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_doc_word.png b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_word.png
new file mode 100644
index 0000000..7f26252
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_doc_word.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_folder.png b/packages/DocumentsUI/res/drawable-mdpi/ic_folder.png
new file mode 100644
index 0000000..17cb056
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png
deleted file mode 100644
index 567a06b..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_focused.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_focused.9.png
deleted file mode 100644
index 1525572..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_pressed.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_pressed.9.png
deleted file mode 100644
index 16c9296..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_card_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder.png
index 6e63b8c..5534c74 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png
deleted file mode 100644
index 1120864..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_grid_gradient_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_hamburger.png b/packages/DocumentsUI/res/drawable-mdpi/ic_hamburger.png
new file mode 100644
index 0000000..440c0f6
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_hamburger.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png
index fbf5c88..fbd5c21 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_copy.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png
index ecb4bf2..1939ed7 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_delete.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am.png
index 96b01b9..bb06624 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_disconnect_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am.png
index ee95809..86b9256 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_new_folder_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow.png
index 7a63828..c7f60c4 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_overflow.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am.png
index 9ab2f78..dc9bbc9 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_rename_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png
index 2d0ab8a..1f45b99 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_search.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png
index cf5575a..db6321d 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_settings.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png
index 368fbd6..f370056 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_share.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am.png
index 2768b1c..86e1cf9 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_sortby_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am.png
index d56db42..ed0ee5d 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_undo_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png
index 0a0c8f1..6af4222 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_grid.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png
index 8a724ac..20197f4 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_menu_view_list.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_open_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_open_am.png
index adfacc1..dab578b 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_open_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_open_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am.png
index b17de2d..12e873d 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_popout_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png
deleted file mode 100644
index 4f903df..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_dark.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_dark.png
new file mode 100644
index 0000000..d3f3e08
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_light.png
new file mode 100644
index 0000000..23663d7
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_download_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_am.png
deleted file mode 100644
index 4352d08..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_dark_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_dark_am.png
new file mode 100644
index 0000000..8d9de3d
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_light_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_light_am.png
new file mode 100644
index 0000000..35505fe
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_folder_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png
deleted file mode 100644
index bf9b1b6..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_dark.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_dark.png
new file mode 100644
index 0000000..67789a3
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_light.png
new file mode 100644
index 0000000..6f8d9a5
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_recent_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png
deleted file mode 100644
index 6adc2a3..0000000
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_dark.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_dark.png
new file mode 100644
index 0000000..3b945e1
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_light.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_light.png
new file mode 100644
index 0000000..7032d5f
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_sdcard_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png
index d318dba..a4f474b 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_root_usb.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am.png b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am.png
index a7a2b12..c8c9f1a 100644
--- a/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-mdpi/ic_subdirectory_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am.png
index 33c8f27..74fdc2b 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_breadcrumb_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png
index ef9641d..6f8f34f 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_accept.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png
index 9c3d008..d360431 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_cancel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png
index 4cf4f3f..21319d8 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_cab_select_item.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png
deleted file mode 100644
index 17f9f9e..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_dark.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_dark.png
new file mode 100644
index 0000000..eeef696
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_light.png
new file mode 100644
index 0000000..0b52ce4a
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_alert_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info.png
deleted file mode 100644
index 2f9cc58..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_dark.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_dark.png
new file mode 100644
index 0000000..7006326
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_light.png
new file mode 100644
index 0000000..28b69c6
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_dialog_info_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album.png
index e67aa8d..8952222 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_album.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png
index d0e2594..bc833b4 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_apk.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_am.png
deleted file mode 100644
index 2e66f03..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_dark_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_dark_am.png
new file mode 100644
index 0000000..c782d0f
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_light_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_light_am.png
new file mode 100644
index 0000000..fbc1e24
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_audio_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png
index 64e0d42..de17d0b 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_certificate.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png
index a4f70ba..d396745 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_codes.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png
index 4897221c..1627d8e 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_compressed.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact_am.png
index 4cec994..a6f91b5 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_contact_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event_am.png
index 5e46b71..cff0ab6 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_event_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_excel.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_excel.png
new file mode 100644
index 0000000..884dd58
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_excel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png
index 977cfd2..9f70fb8 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_font.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_generic_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_generic_am.png
index e05c4b4..7fb5ef6 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_generic_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png
deleted file mode 100644
index 98d3f79..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image_dark.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image_dark.png
new file mode 100644
index 0000000..49e4d0a
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image_light.png
new file mode 100644
index 0000000..09609e3
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_image_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png
index ff2ff14..cdb8471 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_pdf.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_powerpoint.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_powerpoint.png
new file mode 100644
index 0000000..f319929
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_powerpoint.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png
index 2917377..ee8f63c 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_presentation.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet_am.png
index 87c6538..faa648d4 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_spreadsheet_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text_am.png
index 97c4500..872a67b 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_text_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_am.png
deleted file mode 100644
index 1a8e632..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_dark_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_dark_am.png
new file mode 100644
index 0000000..aaa951b
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_light_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_light_am.png
new file mode 100644
index 0000000..1342087
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_video_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_word.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_word.png
new file mode 100644
index 0000000..8c883ad
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_doc_word.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_folder.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_folder.png
new file mode 100644
index 0000000..0d3f869
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png
deleted file mode 100644
index 8f7f4ab..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_focused.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_focused.9.png
deleted file mode 100644
index b82ae20..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_pressed.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_pressed.9.png
deleted file mode 100644
index edd6266..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_card_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder.png
index c3af9ec..a1c9789 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png
deleted file mode 100644
index 60ce8d5..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_grid_gradient_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_hamburger.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_hamburger.png
new file mode 100644
index 0000000..f7a1779
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_hamburger.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png
index c650185..295576c 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_copy.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png
index 0771ed2..19c19ba 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_delete.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am.png
index 91c31e3..22cbd7b 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_disconnect_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am.png
index f06b298..bbdee7e 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_new_folder_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow.png
index c3a7eaa..7a050c9 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_overflow.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am.png
index 17e09b3..8ccca63 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_rename_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png
index 0ab604f..4c87e59 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_search.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png
index 5054fc8..d0929cf 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_settings.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png
index d3d386e..e55b347 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_share.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am.png
index f24ca1a..28b7d5c 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_sortby_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am.png
index 82c1a30..1121c43 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_undo_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png
index 0258312..47b5333 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_grid.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png
index ccace9d..62ab8fb 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_menu_view_list.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am.png
index a56940a..f969418 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_open_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am.png
index f6a0af4..204b04d 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_popout_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png
deleted file mode 100644
index 6c6447e..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_dark.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_dark.png
new file mode 100644
index 0000000..2460761
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_light.png
new file mode 100644
index 0000000..1de0247
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_download_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_am.png
deleted file mode 100644
index c916e0b..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_dark_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_dark_am.png
new file mode 100644
index 0000000..f9788b1
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_light_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_light_am.png
new file mode 100644
index 0000000..ff307cd
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_folder_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png
deleted file mode 100644
index 714f2ee..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_dark.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_dark.png
new file mode 100644
index 0000000..be89734
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_light.png
new file mode 100644
index 0000000..90d1e15
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_recent_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png
deleted file mode 100644
index 6016c08..0000000
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_dark.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_dark.png
new file mode 100644
index 0000000..f788f23
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_light.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_light.png
new file mode 100644
index 0000000..bc2acbe
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_sdcard_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png
index b05b9a4..6ccfb76 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_root_usb.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am.png b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am.png
index 1da8196..94a757a 100644
--- a/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-xhdpi/ic_subdirectory_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am.png
index 06681e3..21272f4 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_breadcrumb_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png
index ac88818..6824bce 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_accept.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png
index 88356c7..81d7816 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_cancel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png
index 75658db..99c3dbb 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_cab_select_item.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png
deleted file mode 100644
index 8bee0dc..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_dark.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_dark.png
new file mode 100644
index 0000000..a91cd76
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_light.png
new file mode 100644
index 0000000..73e440a
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_alert_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info.png
deleted file mode 100644
index ad6c59b..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_dark.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_dark.png
new file mode 100644
index 0000000..aff4bc4
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_light.png
new file mode 100644
index 0000000..7e0fa62
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_dialog_info_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album.png
index 4c56bd0c..e7151cf 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_album.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png
index 5f64229..5c10593 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_apk.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_am.png
deleted file mode 100644
index 48ab9c7..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_dark_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_dark_am.png
new file mode 100644
index 0000000..e96ed99
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_light_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_light_am.png
new file mode 100644
index 0000000..cac2aaf
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_audio_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png
index 68e619e..1ee0875 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_certificate.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png
index 945119a..8d3dabf 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_codes.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png
index bf49d78..c3e21ae 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_compressed.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact_am.png
index 5263365..e809fe65 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_contact_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event_am.png
index 77a0fae..5ed0373 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_event_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_excel.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_excel.png
new file mode 100644
index 0000000..1a373f3
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_excel.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png
index 30d2c4c..b4308b4 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_font.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_generic_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_generic_am.png
index c098866..b5ba48b 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_generic_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_generic_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png
deleted file mode 100644
index 06d8d9c..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image_dark.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image_dark.png
new file mode 100644
index 0000000..63e4255
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image_light.png
new file mode 100644
index 0000000..6237ded
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_image_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png
index a3b146b..2c0a81e 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_pdf.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_powerpoint.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_powerpoint.png
new file mode 100644
index 0000000..2fba5ed
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_powerpoint.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png
index c09d6ab..3e391ce 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_presentation.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet_am.png
index 2170e66..372abc9 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_spreadsheet_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text_am.png
index bc4ce79..e535ca3 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_text_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_am.png
deleted file mode 100644
index 42d8ec1..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_dark_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_dark_am.png
new file mode 100644
index 0000000..48b4a72
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_light_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_light_am.png
new file mode 100644
index 0000000..15d6c50
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_video_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_word.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_word.png
new file mode 100644
index 0000000..9ccf41e
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_doc_word.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_folder.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_folder.png
new file mode 100644
index 0000000..9bedcd9
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png
deleted file mode 100644
index 7bbaf9d..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_background.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_focused.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_focused.9.png
deleted file mode 100644
index 901af80..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_focused.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_pressed.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_pressed.9.png
deleted file mode 100644
index e21e350..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_card_pressed.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder.png
index 86a74cd..10cdd51 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_folder.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png
deleted file mode 100644
index 988c856..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_grid_gradient_bg.9.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_hamburger.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_hamburger.png
new file mode 100644
index 0000000..355f61f
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_hamburger.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png
index f23e23c..7f483e1 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_copy.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png
index f67c72e..c19988f 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_delete.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am.png
index 676d0f7..d10bec8 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_disconnect_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am.png
index b17ba1d0..4013b7c 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_new_folder_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow.png
index 58f1381..036127c 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_overflow.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am.png
index eed0eaf..0fef9d0 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_rename_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png
index 40fb392..af79507 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_search.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png
index b988ab5..db2ef7b 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_settings.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png
index 6ace932..e6befad 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_share.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am.png
index 8f19afa..89bf79f 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_sortby_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am.png
index e4c9f8a..7acc684e 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_undo_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png
index 9e27d63..0bee75a 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_grid.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png
index e4c679a..da13073 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_menu_view_list.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am.png
index b467962..7196ee5 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_open_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am.png
index 5f5a86f..6fa2216 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_popout_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png
deleted file mode 100644
index 3b8afc9..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_dark.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_dark.png
new file mode 100644
index 0000000..067aa655
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_light.png
new file mode 100644
index 0000000..40437a8
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_download_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_am.png
deleted file mode 100644
index 077c851..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_am.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_dark_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_dark_am.png
new file mode 100644
index 0000000..069d951
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_dark_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_light_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_light_am.png
new file mode 100644
index 0000000..1725025
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_folder_light_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png
deleted file mode 100644
index a3215f2..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_dark.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_dark.png
new file mode 100644
index 0000000..d149239
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_light.png
new file mode 100644
index 0000000..9a06663
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_recent_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png
deleted file mode 100644
index 873a553..0000000
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard.png
+++ /dev/null
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_dark.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_dark.png
new file mode 100644
index 0000000..429f3c5
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_dark.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_light.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_light.png
new file mode 100644
index 0000000..bcfe7fd
--- /dev/null
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_sdcard_light.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png
index d213e7c..c31b4dc 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_root_usb.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am.png b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am.png
index db53a01..d852b8ec 100644
--- a/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am.png
+++ b/packages/DocumentsUI/res/drawable-xxhdpi/ic_subdirectory_arrow_am.png
Binary files differ
diff --git a/packages/DocumentsUI/res/drawable/item_doc_grid.xml b/packages/DocumentsUI/res/drawable/grid_protect_background.xml
similarity index 75%
rename from packages/DocumentsUI/res/drawable/item_doc_grid.xml
rename to packages/DocumentsUI/res/drawable/grid_protect_background.xml
index 3f036f7..2e7aadd 100644
--- a/packages/DocumentsUI/res/drawable/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/drawable/grid_protect_background.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -15,5 +15,10 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/ic_grid_card_background" />
+    <item android:state_enabled="false">
+        <color android:color="#88000000" />
+    </item>
+    <item>
+        <color android:color="#88252525" />
+    </item>
 </selector>
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml b/packages/DocumentsUI/res/drawable/ic_doc_audio_dark.xml
similarity index 93%
copy from packages/DocumentsUI/res/drawable/ic_doc_audio.xml
copy to packages/DocumentsUI/res/drawable/ic_doc_audio_dark.xml
index c6ccea6..768d409 100644
--- a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml
+++ b/packages/DocumentsUI/res/drawable/ic_doc_audio_dark.xml
@@ -18,6 +18,6 @@
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_audio_am"
+        android:src="@drawable/ic_doc_audio_dark_am"
         android:autoMirrored="true">
 </bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml b/packages/DocumentsUI/res/drawable/ic_doc_audio_light.xml
similarity index 93%
copy from packages/DocumentsUI/res/drawable/ic_doc_audio.xml
copy to packages/DocumentsUI/res/drawable/ic_doc_audio_light.xml
index c6ccea6..bdb6983 100644
--- a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml
+++ b/packages/DocumentsUI/res/drawable/ic_doc_audio_light.xml
@@ -18,6 +18,6 @@
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_audio_am"
+        android:src="@drawable/ic_doc_audio_light_am"
         android:autoMirrored="true">
 </bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_video.xml b/packages/DocumentsUI/res/drawable/ic_doc_video.xml
deleted file mode 100644
index e196262..0000000
--- a/packages/DocumentsUI/res/drawable/ic_doc_video.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 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.
- */
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_video_am"
-        android:autoMirrored="true">
-</bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml b/packages/DocumentsUI/res/drawable/ic_doc_video_dark.xml
similarity index 93%
rename from packages/DocumentsUI/res/drawable/ic_doc_audio.xml
rename to packages/DocumentsUI/res/drawable/ic_doc_video_dark.xml
index c6ccea6..4fb82bb 100644
--- a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml
+++ b/packages/DocumentsUI/res/drawable/ic_doc_video_dark.xml
@@ -18,6 +18,6 @@
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_audio_am"
+        android:src="@drawable/ic_doc_video_dark_am"
         android:autoMirrored="true">
 </bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml b/packages/DocumentsUI/res/drawable/ic_doc_video_light.xml
similarity index 93%
copy from packages/DocumentsUI/res/drawable/ic_doc_audio.xml
copy to packages/DocumentsUI/res/drawable/ic_doc_video_light.xml
index c6ccea6..290c3f1a 100644
--- a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml
+++ b/packages/DocumentsUI/res/drawable/ic_doc_video_light.xml
@@ -18,6 +18,6 @@
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_audio_am"
+        android:src="@drawable/ic_doc_video_light_am"
         android:autoMirrored="true">
 </bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_root_folder.xml b/packages/DocumentsUI/res/drawable/ic_root_folder.xml
deleted file mode 100644
index a3c8f61..0000000
--- a/packages/DocumentsUI/res/drawable/ic_root_folder.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright 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.
- */
--->
-
-<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_root_folder_am"
-        android:autoMirrored="true">
-</bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml b/packages/DocumentsUI/res/drawable/ic_root_folder_dark.xml
similarity index 93%
copy from packages/DocumentsUI/res/drawable/ic_doc_audio.xml
copy to packages/DocumentsUI/res/drawable/ic_root_folder_dark.xml
index c6ccea6..8e29d1d 100644
--- a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml
+++ b/packages/DocumentsUI/res/drawable/ic_root_folder_dark.xml
@@ -18,6 +18,6 @@
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_audio_am"
+        android:src="@drawable/ic_root_folder_dark_am"
         android:autoMirrored="true">
 </bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml b/packages/DocumentsUI/res/drawable/ic_root_folder_light.xml
similarity index 92%
copy from packages/DocumentsUI/res/drawable/ic_doc_audio.xml
copy to packages/DocumentsUI/res/drawable/ic_root_folder_light.xml
index c6ccea6..a750f1f 100644
--- a/packages/DocumentsUI/res/drawable/ic_doc_audio.xml
+++ b/packages/DocumentsUI/res/drawable/ic_root_folder_light.xml
@@ -18,6 +18,6 @@
 -->
 
 <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
-        android:src="@drawable/ic_doc_audio_am"
+        android:src="@drawable/ic_root_folder_light_am"
         android:autoMirrored="true">
 </bitmap>
\ No newline at end of file
diff --git a/packages/DocumentsUI/res/drawable/item_doc_grid.xml b/packages/DocumentsUI/res/drawable/item_activated.xml
similarity index 71%
copy from packages/DocumentsUI/res/drawable/item_doc_grid.xml
copy to packages/DocumentsUI/res/drawable/item_activated.xml
index 3f036f7..6ffefdb 100644
--- a/packages/DocumentsUI/res/drawable/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/drawable/item_activated.xml
@@ -15,5 +15,7 @@
 -->
 
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/ic_grid_card_background" />
+    <item android:state_focused="true" android:state_activated="true" android:drawable="@color/accent_item_activated" />
+    <item android:state_focused="false" android:state_activated="true" android:drawable="@color/accent_item_activated" />
+    <item android:drawable="@android:color/transparent" />
 </selector>
diff --git a/packages/DocumentsUI/res/drawable/item_background.xml b/packages/DocumentsUI/res/drawable/item_background.xml
deleted file mode 100644
index ec9be6d..0000000
--- a/packages/DocumentsUI/res/drawable/item_background.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <item android:state_window_focused="false" android:drawable="@android:color/transparent" />
-
-    <item android:state_focused="true"   android:state_activated="true" android:drawable="@drawable/ic_grid_card_focused" />
-    <item android:state_focused="false"  android:state_activated="true" android:drawable="@drawable/ic_grid_card_focused" />
-
-    <item android:state_focused="true"  android:state_enabled="false" android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" />
-    <item android:state_focused="true"  android:state_enabled="false"                              android:drawable="@drawable/ic_grid_card_pressed" />
-    <item android:state_focused="true"                                android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" />
-    <item android:state_focused="false"                               android:state_pressed="true" android:drawable="@drawable/ic_grid_card_pressed" />
-    <item android:state_focused="true"                                                             android:drawable="@drawable/ic_grid_card_pressed" />
-
-    <item android:drawable="@android:color/transparent" />
-
-</selector>
diff --git a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
index adbb9da..5f1e432 100644
--- a/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
+++ b/packages/DocumentsUI/res/layout-sw720dp-land/item_doc_list.xml
@@ -14,103 +14,111 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/item_background"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
-    android:gravity="center_vertical"
-    android:orientation="horizontal"
-    android:baselineAligned="false">
+    android:foreground="@drawable/item_activated">
 
-    <FrameLayout
-        android:id="@android:id/icon"
-        android:layout_width="@dimen/icon_size"
-        android:layout_height="@dimen/icon_size"
-        android:layout_marginStart="12dp"
-        android:layout_marginEnd="20dp">
-
-        <ImageView
-            android:id="@+id/icon_mime"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:scaleType="centerInside"
-            android:contentDescription="@null" />
-
-        <ImageView
-            android:id="@+id/icon_thumb"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:scaleType="centerCrop"
-            android:contentDescription="@null" />
-
-    </FrameLayout>
-
-    <!-- This is the one special case where we want baseline alignment! -->
     <LinearLayout
-        android:layout_width="0dp"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="horizontal">
+        android:minHeight="@dimen/list_item_height"
+        android:paddingStart="@dimen/list_item_padding"
+        android:paddingEnd="@dimen/list_item_padding"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:baselineAligned="false">
 
-        <TextView
-            android:id="@android:id/title"
+        <FrameLayout
+            android:id="@android:id/icon"
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:layout_marginStart="0dp"
+            android:layout_marginEnd="16dp">
+
+            <ImageView
+                android:id="@+id/icon_mime"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
+                android:scaleType="centerInside"
+                android:contentDescription="@null" />
+
+            <ImageView
+                android:id="@+id/icon_thumb"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:scaleType="centerCrop"
+                android:contentDescription="@null" />
+
+        </FrameLayout>
+
+        <!-- This is the one special case where we want baseline alignment! -->
+        <LinearLayout
             android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:layout_weight="0.5"
-            android:layout_marginEnd="12dp"
-            android:singleLine="true"
-            android:ellipsize="middle"
-            android:textAlignment="viewStart"
-            style="@style/TextAppearance.Medium" />
+            android:layout_weight="1"
+            android:orientation="horizontal">
 
-        <ImageView
-            android:id="@android:id/icon1"
-            android:layout_width="@dimen/root_icon_size"
-            android:layout_height="@dimen/root_icon_size"
-            android:layout_marginEnd="8dp"
-            android:scaleType="centerInside"
-            android:contentDescription="@null" />
+            <TextView
+                android:id="@android:id/title"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="0.5"
+                android:layout_marginEnd="12dp"
+                android:singleLine="true"
+                android:ellipsize="middle"
+                android:textAlignment="viewStart"
+                android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                android:textColor="?android:attr/textColorPrimary" />
 
-        <TextView
-            android:id="@android:id/summary"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="0.25"
-            android:layout_marginEnd="12dp"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textAlignment="viewStart"
-            style="@style/TextAppearance.Small" />
+            <ImageView
+                android:id="@android:id/icon1"
+                android:layout_width="@dimen/root_icon_size"
+                android:layout_height="@dimen/root_icon_size"
+                android:layout_marginEnd="8dp"
+                android:scaleType="centerInside"
+                android:contentDescription="@null" />
 
-        <TextView
-            android:id="@+id/size"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="0.125"
-            android:layout_marginEnd="12dp"
-            android:minWidth="70dp"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textAlignment="viewEnd"
-            style="@style/TextAppearance.Small" />
+            <TextView
+                android:id="@android:id/summary"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="0.25"
+                android:layout_marginEnd="12dp"
+                android:singleLine="true"
+                android:ellipsize="end"
+                android:textAlignment="viewStart"
+                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textColor="?android:attr/textColorSecondary" />
 
-        <TextView
-            android:id="@+id/date"
-            android:layout_width="0dp"
-            android:layout_height="wrap_content"
-            android:layout_weight="0.125"
-            android:layout_marginEnd="12dp"
-            android:minWidth="70dp"
-            android:singleLine="true"
-            android:ellipsize="end"
-            android:textAlignment="viewEnd"
-            style="@style/TextAppearance.Small" />
+            <TextView
+                android:id="@+id/size"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="0.125"
+                android:layout_marginEnd="12dp"
+                android:minWidth="70dp"
+                android:singleLine="true"
+                android:ellipsize="end"
+                android:textAlignment="viewEnd"
+                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textColor="?android:attr/textColorSecondary" />
+
+            <TextView
+                android:id="@+id/date"
+                android:layout_width="0dp"
+                android:layout_height="wrap_content"
+                android:layout_weight="0.125"
+                android:layout_marginEnd="12dp"
+                android:minWidth="70dp"
+                android:singleLine="true"
+                android:ellipsize="end"
+                android:textAlignment="viewEnd"
+                android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                android:textColor="?android:attr/textColorSecondary" />
+
+        </LinearLayout>
 
     </LinearLayout>
 
-</LinearLayout>
+</FrameLayout>
diff --git a/packages/DocumentsUI/res/layout/fragment_directory.xml b/packages/DocumentsUI/res/layout/fragment_directory.xml
index 77cdc3b..09b50c0 100644
--- a/packages/DocumentsUI/res/layout/fragment_directory.xml
+++ b/packages/DocumentsUI/res/layout/fragment_directory.xml
@@ -31,8 +31,7 @@
     <ListView
         android:id="@+id/list"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:listSelector="@android:color/transparent" />
+        android:layout_height="match_parent" />
 
     <GridView
         android:id="@+id/grid"
@@ -40,11 +39,13 @@
         android:layout_height="match_parent"
         android:paddingStart="@dimen/grid_padding_horiz"
         android:paddingEnd="@dimen/grid_padding_horiz"
-        android:paddingTop="@dimen/grid_padding"
-        android:paddingBottom="@dimen/grid_padding"
+        android:paddingTop="@dimen/grid_padding_vert"
+        android:paddingBottom="@dimen/grid_padding_vert"
+        android:horizontalSpacing="@dimen/grid_item_padding"
+        android:verticalSpacing="@dimen/grid_item_padding"
         android:clipToPadding="false"
         android:scrollbarStyle="outsideOverlay"
-        android:listSelector="@android:color/transparent"
+        android:drawSelectorOnTop="true"
         android:visibility="gone" />
 
 </com.android.documentsui.DirectoryView>
diff --git a/packages/DocumentsUI/res/layout/item_doc_grid.xml b/packages/DocumentsUI/res/layout/item_doc_grid.xml
index 3aef1cd..0fc606d 100644
--- a/packages/DocumentsUI/res/layout/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_grid.xml
@@ -16,110 +16,111 @@
 
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
-    android:layout_height="@dimen/grid_height"
-    android:background="@drawable/item_doc_grid"
-    android:foreground="@drawable/item_background">
+    android:layout_height="@dimen/grid_item_height"
+    android:orientation="vertical"
+    android:background="@color/grid_item_background"
+    android:foreground="@drawable/item_activated">
+
+    <ImageView
+        android:id="@+id/icon_thumb"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scaleType="centerCrop"
+        android:contentDescription="@null" />
 
     <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:paddingBottom="6dp"
         android:orientation="vertical">
 
-        <FrameLayout
+        <ImageView
+            android:id="@+id/icon_mime"
             android:layout_width="match_parent"
             android:layout_height="0dp"
             android:layout_weight="1"
-            android:layout_marginBottom="6dp"
-            android:background="#fff"
-            android:foreground="@drawable/ic_grid_gradient_bg"
-            android:foregroundGravity="fill">
-
-            <ImageView
-                android:id="@+id/icon_mime"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:scaleType="centerInside"
-                android:contentDescription="@null" />
-
-            <ImageView
-                android:id="@+id/icon_thumb"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:scaleType="centerCrop"
-                android:contentDescription="@null" />
-
-        </FrameLayout>
+            android:scaleType="centerInside"
+            android:contentDescription="@null" />
 
         <LinearLayout
-            android:id="@+id/line1"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:baselineAligned="false"
+            android:background="@drawable/grid_protect_background"
+            android:orientation="vertical"
             android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+            android:paddingTop="8dp"
+            android:paddingBottom="8dp">
 
-            <TextView
-                android:id="@android:id/title"
-                android:layout_width="0dp"
+            <LinearLayout
+                android:id="@+id/line1"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:singleLine="true"
-                android:ellipsize="middle"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Medium" />
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:baselineAligned="false">
 
-            <ImageView
-                android:id="@android:id/icon1"
-                android:layout_width="@dimen/root_icon_size"
-                android:layout_height="@dimen/root_icon_size"
-                android:layout_marginStart="8dp"
-                android:scaleType="centerInside"
-                android:contentDescription="@null" />
+                <TextView
+                    android:id="@android:id/title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:singleLine="true"
+                    android:ellipsize="middle"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                    android:textColor="?android:attr/textColorPrimaryInverse" />
 
-        </LinearLayout>
+                <ImageView
+                    android:id="@android:id/icon1"
+                    android:layout_width="@dimen/root_icon_size"
+                    android:layout_height="@dimen/root_icon_size"
+                    android:layout_marginStart="8dp"
+                    android:scaleType="centerInside"
+                    android:contentDescription="@null" />
 
-        <LinearLayout
-            android:id="@+id/line2"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:baselineAligned="false"
-            android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-            android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
+            </LinearLayout>
 
-            <TextView
-                android:id="@+id/date"
-                android:layout_width="0dp"
+            <LinearLayout
+                android:id="@+id/line2"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_weight="0.5"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Small" />
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:baselineAligned="false">
 
-            <TextView
-                android:id="@+id/size"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="0.5"
-                android:layout_marginStart="8dp"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Small" />
+                <TextView
+                    android:id="@+id/date"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="0.5"
+                    android:singleLine="true"
+                    android:ellipsize="end"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Caption"
+                    android:textColor="?android:attr/textColorPrimaryInverse" />
 
-            <ImageView
-                android:id="@android:id/icon2"
-                android:layout_width="@dimen/root_icon_size"
-                android:layout_height="@dimen/root_icon_size"
-                android:layout_marginStart="8dp"
-                android:scaleType="centerInside"
-                android:contentDescription="@null"
-                android:visibility="gone" />
+                <TextView
+                    android:id="@+id/size"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="0.5"
+                    android:layout_marginStart="8dp"
+                    android:singleLine="true"
+                    android:ellipsize="end"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Caption"
+                    android:textColor="?android:attr/textColorPrimaryInverse" />
+
+                <ImageView
+                    android:id="@android:id/icon2"
+                    android:layout_width="@dimen/root_icon_size"
+                    android:layout_height="@dimen/root_icon_size"
+                    android:layout_marginStart="8dp"
+                    android:scaleType="centerInside"
+                    android:contentDescription="@null"
+                    android:visibility="gone" />
+
+            </LinearLayout>
 
         </LinearLayout>
 
diff --git a/packages/DocumentsUI/res/layout/item_doc_list.xml b/packages/DocumentsUI/res/layout/item_doc_list.xml
index e3a0ddd..50ed2d6 100644
--- a/packages/DocumentsUI/res/layout/item_doc_list.xml
+++ b/packages/DocumentsUI/res/layout/item_doc_list.xml
@@ -14,114 +14,121 @@
      limitations under the License.
 -->
 
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/item_background"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
-    android:gravity="center_vertical"
-    android:orientation="horizontal"
-    android:baselineAligned="false">
-
-    <FrameLayout
-        android:id="@android:id/icon"
-        android:layout_width="@dimen/icon_size"
-        android:layout_height="@dimen/icon_size"
-        android:layout_marginStart="12dp"
-        android:layout_marginEnd="20dp">
-
-        <ImageView
-            android:id="@+id/icon_mime"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:scaleType="centerInside"
-            android:contentDescription="@null" />
-
-        <ImageView
-            android:id="@+id/icon_thumb"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:scaleType="centerCrop"
-            android:contentDescription="@null" />
-
-    </FrameLayout>
+    android:foreground="@drawable/item_activated">
 
     <LinearLayout
-        android:layout_width="0dp"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_weight="1"
-        android:orientation="vertical">
+        android:minHeight="@dimen/list_item_height"
+        android:paddingStart="@dimen/list_item_padding"
+        android:paddingEnd="@dimen/list_item_padding"
+        android:gravity="center_vertical"
+        android:orientation="horizontal"
+        android:baselineAligned="false">
 
-        <LinearLayout
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:orientation="horizontal"
-            android:baselineAligned="false">
-
-            <TextView
-                android:id="@android:id/title"
-                android:layout_width="0dp"
-                android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:singleLine="true"
-                android:ellipsize="middle"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Medium" />
+        <FrameLayout
+            android:id="@android:id/icon"
+            android:layout_width="@dimen/icon_size"
+            android:layout_height="@dimen/icon_size"
+            android:layout_marginEnd="16dp">
 
             <ImageView
-                android:id="@android:id/icon1"
-                android:layout_width="@dimen/root_icon_size"
-                android:layout_height="@dimen/root_icon_size"
-                android:layout_marginStart="8dp"
+                android:id="@+id/icon_mime"
+                android:layout_width="wrap_content"
+                android:layout_height="match_parent"
                 android:scaleType="centerInside"
                 android:contentDescription="@null" />
 
-        </LinearLayout>
+            <ImageView
+                android:id="@+id/icon_thumb"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:scaleType="centerCrop"
+                android:contentDescription="@null" />
+
+        </FrameLayout>
 
         <LinearLayout
-            android:id="@+id/line2"
-            android:layout_width="match_parent"
+            android:layout_width="0dp"
             android:layout_height="wrap_content"
-            android:gravity="center_vertical"
-            android:orientation="horizontal"
-            android:baselineAligned="false">
+            android:layout_weight="1"
+            android:orientation="vertical">
 
-            <TextView
-                android:id="@+id/date"
-                android:layout_width="90dp"
+            <LinearLayout
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Small" />
+                android:orientation="horizontal"
+                android:baselineAligned="false">
 
-            <TextView
-                android:id="@+id/size"
-                android:layout_width="90dp"
-                android:layout_height="wrap_content"
-                android:layout_marginStart="8dp"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Small" />
+                <TextView
+                    android:id="@android:id/title"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:singleLine="true"
+                    android:ellipsize="middle"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+                    android:textColor="?android:attr/textColorPrimary" />
 
-            <TextView
-                android:id="@android:id/summary"
-                android:layout_width="0dp"
+                <ImageView
+                    android:id="@android:id/icon1"
+                    android:layout_width="@dimen/root_icon_size"
+                    android:layout_height="@dimen/root_icon_size"
+                    android:layout_marginStart="8dp"
+                    android:scaleType="centerInside"
+                    android:contentDescription="@null" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/line2"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_weight="1"
-                android:layout_marginStart="8dp"
-                android:singleLine="true"
-                android:ellipsize="end"
-                android:textAlignment="viewStart"
-                style="@style/TextAppearance.Small" />
+                android:gravity="center_vertical"
+                android:orientation="horizontal"
+                android:baselineAligned="false">
+
+                <TextView
+                    android:id="@+id/date"
+                    android:layout_width="90dp"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:ellipsize="end"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textColor="?android:attr/textColorSecondary" />
+
+                <TextView
+                    android:id="@+id/size"
+                    android:layout_width="90dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginStart="8dp"
+                    android:singleLine="true"
+                    android:ellipsize="end"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textColor="?android:attr/textColorSecondary" />
+
+                <TextView
+                    android:id="@android:id/summary"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_weight="1"
+                    android:layout_marginStart="8dp"
+                    android:singleLine="true"
+                    android:ellipsize="end"
+                    android:textAlignment="viewStart"
+                    android:textAppearance="@android:style/TextAppearance.Material.Body1"
+                    android:textColor="?android:attr/textColorSecondary" />
+
+            </LinearLayout>
 
         </LinearLayout>
 
     </LinearLayout>
 
-</LinearLayout>
+</FrameLayout>
diff --git a/packages/DocumentsUI/res/layout/item_loading_grid.xml b/packages/DocumentsUI/res/layout/item_loading_grid.xml
index 0bf6137..005a111 100644
--- a/packages/DocumentsUI/res/layout/item_loading_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_loading_grid.xml
@@ -17,11 +17,6 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/grid_height"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp"
     android:orientation="horizontal">
 
     <ProgressBar
diff --git a/packages/DocumentsUI/res/layout/item_loading_list.xml b/packages/DocumentsUI/res/layout/item_loading_list.xml
index cdcd01d..6f214ed 100644
--- a/packages/DocumentsUI/res/layout/item_loading_list.xml
+++ b/packages/DocumentsUI/res/layout/item_loading_list.xml
@@ -17,11 +17,7 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingTop="8dp"
-    android:paddingBottom="8dp">
+    android:minHeight="@dimen/list_item_height">
 
     <ProgressBar
         android:layout_width="wrap_content"
diff --git a/packages/DocumentsUI/res/layout/item_message_grid.xml b/packages/DocumentsUI/res/layout/item_message_grid.xml
index b3bdd28..385563d 100644
--- a/packages/DocumentsUI/res/layout/item_message_grid.xml
+++ b/packages/DocumentsUI/res/layout/item_message_grid.xml
@@ -17,11 +17,10 @@
 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/grid_height"
-    android:paddingTop="?android:attr/listPreferredItemPaddingStart"
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
-    android:paddingBottom="?android:attr/listPreferredItemPaddingEnd"
-    android:foreground="@drawable/item_background">
+    android:paddingTop="8dp"
+    android:paddingBottom="8dp">
 
     <LinearLayout
         android:layout_width="match_parent"
@@ -42,9 +41,10 @@
             android:gravity="center"
             android:maxLines="4"
             android:ellipsize="end"
-            android:paddingTop="6dp"
-            android:textAppearance="?android:attr/textAppearanceSmall"
-            android:textAlignment="viewStart" />
+            android:paddingTop="8dp"
+            android:textAlignment="viewStart"
+            android:textAppearance="@android:style/TextAppearance.Material.Body1"
+            android:textColor="?android:attr/textColorPrimary" />
 
     </LinearLayout>
 
diff --git a/packages/DocumentsUI/res/layout/item_message_list.xml b/packages/DocumentsUI/res/layout/item_message_list.xml
index 2bcbc2d..44c8baf 100644
--- a/packages/DocumentsUI/res/layout/item_message_list.xml
+++ b/packages/DocumentsUI/res/layout/item_message_list.xml
@@ -17,23 +17,28 @@
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:background="@drawable/item_background"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
-    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
+    android:minHeight="@dimen/list_item_height"
+    android:paddingStart="@dimen/list_item_padding"
+    android:paddingEnd="@dimen/list_item_padding"
     android:paddingTop="8dp"
     android:paddingBottom="8dp"
+    android:gravity="center_vertical"
     android:orientation="horizontal"
     android:baselineAligned="false">
 
-    <ImageView
-        android:id="@android:id/icon"
-        android:layout_width="@android:dimen/app_icon_size"
-        android:layout_height="@android:dimen/app_icon_size"
-        android:layout_marginEnd="8dp"
-        android:layout_gravity="center_vertical"
-        android:scaleType="centerInside"
-        android:contentDescription="@null" />
+    <FrameLayout
+        android:layout_width="@dimen/icon_size"
+        android:layout_height="@dimen/icon_size"
+        android:layout_marginEnd="16dp">
+
+        <ImageView
+            android:id="@android:id/icon"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:scaleType="centerInside"
+            android:contentDescription="@null" />
+
+    </FrameLayout>
 
     <TextView
         android:id="@android:id/title"
@@ -43,6 +48,7 @@
         android:maxLines="2"
         android:ellipsize="end"
         android:textAlignment="viewStart"
-        android:textAppearance="?android:attr/textAppearanceSmall" />
+        android:textAppearance="@android:style/TextAppearance.Material.Body1"
+        android:textColor="?android:attr/textColorPrimary" />
 
 </LinearLayout>
diff --git a/packages/DocumentsUI/res/drawable/item_doc_grid.xml b/packages/DocumentsUI/res/values-ldrtl/dimens.xml
similarity index 74%
copy from packages/DocumentsUI/res/drawable/item_doc_grid.xml
copy to packages/DocumentsUI/res/values-ldrtl/dimens.xml
index 3f036f7..22f8131 100644
--- a/packages/DocumentsUI/res/drawable/item_doc_grid.xml
+++ b/packages/DocumentsUI/res/values-ldrtl/dimens.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
+<!-- Copyright (C) 2014 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.
@@ -14,6 +14,6 @@
      limitations under the License.
 -->
 
-<selector xmlns:android="http://schemas.android.com/apk/res/android">
-    <item android:drawable="@drawable/ic_grid_card_background" />
-</selector>
+<resources>
+    <bool name="list_divider_inset_left">false</bool>
+</resources>
diff --git a/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml b/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml
index 961608c..c9dee8d 100644
--- a/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml
+++ b/packages/DocumentsUI/res/values-sw720dp-land/dimens.xml
@@ -16,4 +16,10 @@
 
 <resources>
     <bool name="always_show_summary">true</bool>
+
+    <dimen name="list_item_height">64dp</dimen>
+    <dimen name="list_item_padding">24dp</dimen>
+
+    <dimen name="list_divider_inset">80dp</dimen>
+
 </resources>
diff --git a/packages/DocumentsUI/res/values-sw720dp/dimens.xml b/packages/DocumentsUI/res/values-sw720dp/dimens.xml
index 3a75dfa..75afe01 100644
--- a/packages/DocumentsUI/res/values-sw720dp/dimens.xml
+++ b/packages/DocumentsUI/res/values-sw720dp/dimens.xml
@@ -20,5 +20,9 @@
     <item type="dimen" name="dialog_width">85%</item>
     <item type="dimen" name="dialog_height">90%</item>
 
-    <dimen name="grid_padding_horiz">20dp</dimen>
+    <dimen name="grid_padding_horiz">24dp</dimen>
+    <dimen name="grid_padding_vert">8dp</dimen>
+
+    <dimen name="grid_item_padding">8dp</dimen>
+
 </resources>
diff --git a/packages/DocumentsUI/res/values/colors.xml b/packages/DocumentsUI/res/values/colors.xml
index adeff77..e3d7f2d 100644
--- a/packages/DocumentsUI/res/values/colors.xml
+++ b/packages/DocumentsUI/res/values/colors.xml
@@ -18,4 +18,9 @@
     <color name="chip">#ddd</color>
     <color name="item_root_pressed">#33cccccc</color>
     <color name="item_root_focused">#66cccccc</color>
+
+    <color name="grid_item_background">#ffe1e1e0</color>
+
+    <color name="accent_item_activated">#88009587</color>
+
 </resources>
diff --git a/packages/DocumentsUI/res/values/dimens.xml b/packages/DocumentsUI/res/values/dimens.xml
index 924a8d6..83a0bf4 100644
--- a/packages/DocumentsUI/res/values/dimens.xml
+++ b/packages/DocumentsUI/res/values/dimens.xml
@@ -15,14 +15,26 @@
 -->
 
 <resources>
-    <dimen name="icon_size">32dp</dimen>
+    <dimen name="icon_size">40dp</dimen>
     <dimen name="root_icon_size">24dp</dimen>
-    <dimen name="grid_width">160dp</dimen>
-    <dimen name="grid_height">170dp</dimen>
 
-    <dimen name="grid_padding">4dp</dimen>
+    <dimen name="grid_width">160dp</dimen>
+    <dimen name="grid_height">176dp</dimen>
+
+    <dimen name="grid_item_width">160dp</dimen>
+    <dimen name="grid_item_height">176dp</dimen>
+    <dimen name="grid_item_padding">4dp</dimen>
+
     <dimen name="grid_padding_horiz">4dp</dimen>
+    <dimen name="grid_padding_vert">4dp</dimen>
+
+    <dimen name="list_item_height">72dp</dimen>
+    <dimen name="list_item_padding">16dp</dimen>
+
+    <dimen name="list_divider_inset">72dp</dimen>
+    <bool name="list_divider_inset_left">true</bool>
 
     <bool name="show_as_dialog">false</bool>
     <bool name="always_show_summary">false</bool>
+
 </resources>
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryContainerView.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryContainerView.java
index 77595b6..00b3c87 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryContainerView.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryContainerView.java
@@ -29,12 +29,18 @@
 
     public DirectoryContainerView(Context context) {
         super(context);
-        setClipChildren(false);
     }
 
     public DirectoryContainerView(Context context, AttributeSet attrs) {
         super(context, attrs);
+    }
+
+    @Override
+    protected void onFinishInflate() {
+        super.onFinishInflate();
         setClipChildren(false);
+        setClipToOutline(false);
+        setClipToPadding(false);
     }
 
     @Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
index 9069a55..e013cc3 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryFragment.java
@@ -38,6 +38,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.Loader;
+import android.content.res.Resources;
 import android.database.Cursor;
 import android.graphics.Bitmap;
 import android.graphics.Point;
@@ -187,6 +188,7 @@
     public View onCreateView(
             LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
         final Context context = inflater.getContext();
+        final Resources res = context.getResources();
         final View view = inflater.inflate(R.layout.fragment_directory, container, false);
 
         mEmptyView = view.findViewById(android.R.id.empty);
@@ -196,6 +198,16 @@
         mListView.setMultiChoiceModeListener(mMultiListener);
         mListView.setRecyclerListener(mRecycleListener);
 
+        // Indent our list divider to align with text
+        final Drawable divider = mListView.getDivider();
+        final boolean insetLeft = res.getBoolean(R.bool.list_divider_inset_left);
+        final int insetSize = res.getDimensionPixelSize(R.dimen.list_divider_inset);
+        if (insetLeft) {
+            mListView.setDivider(new InsetDrawable(divider, insetSize, 0, 0, 0));
+        } else {
+            mListView.setDivider(new InsetDrawable(divider, 0, 0, insetSize, 0));
+        }
+
         mGridView = (GridView) view.findViewById(R.id.grid);
         mGridView.setOnItemClickListener(mItemListener);
         mGridView.setMultiChoiceModeListener(mMultiListener);
@@ -693,11 +705,11 @@
             if (extras != null) {
                 final String info = extras.getString(DocumentsContract.EXTRA_INFO);
                 if (info != null) {
-                    mFooters.add(new MessageFooter(2, R.drawable.ic_dialog_info, info));
+                    mFooters.add(new MessageFooter(2, R.drawable.ic_dialog_info_dark, info));
                 }
                 final String error = extras.getString(DocumentsContract.EXTRA_ERROR);
                 if (error != null) {
-                    mFooters.add(new MessageFooter(3, R.drawable.ic_dialog_alert, error));
+                    mFooters.add(new MessageFooter(3, R.drawable.ic_dialog_alert_dark, error));
                 }
                 if (extras.getBoolean(DocumentsContract.EXTRA_LOADING, false)) {
                     mFooters.add(new LoadingFooter());
@@ -706,7 +718,7 @@
 
             if (result != null && result.exception != null) {
                 mFooters.add(new MessageFooter(
-                        3, R.drawable.ic_dialog_alert, getString(R.string.query_error)));
+                        3, R.drawable.ic_dialog_alert_dark, getString(R.string.query_error)));
             }
 
             if (isEmpty()) {
@@ -748,21 +760,6 @@
                     convertView = inflater.inflate(R.layout.item_doc_list, parent, false);
                 } else if (state.derivedMode == MODE_GRID) {
                     convertView = inflater.inflate(R.layout.item_doc_grid, parent, false);
-
-                    // Apply padding to grid items
-                    final FrameLayout grid = (FrameLayout) convertView;
-                    final int gridPadding = getResources()
-                            .getDimensionPixelSize(R.dimen.grid_padding);
-
-                    // Tricksy hobbitses! We need to fully clear the drawable so
-                    // the view doesn't clobber the new InsetDrawable callback
-                    // when setting back later.
-                    final Drawable fg = grid.getForeground();
-                    final Drawable bg = grid.getBackground();
-                    grid.setForeground(null);
-                    grid.setBackground(null);
-                    grid.setForeground(new InsetDrawable(fg, gridPadding));
-                    grid.setBackground(new InsetDrawable(bg, gridPadding));
                 } else {
                     throw new IllegalStateException();
                 }
@@ -882,7 +879,8 @@
                 // hint to remind user they're a directory.
                 if (Document.MIME_TYPE_DIR.equals(docMimeType) && state.derivedMode == MODE_GRID
                         && showThumbnail) {
-                    iconDrawable = context.getResources().getDrawable(R.drawable.ic_root_folder);
+                    iconDrawable = context.getResources().getDrawable(
+                            R.drawable.ic_root_folder_dark);
                 }
 
                 if (summary != null) {
diff --git a/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java b/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java
index b552e5a..c163c46 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/DirectoryView.java
@@ -40,8 +40,13 @@
     public void setBackground(Drawable background) {
         final Rect rect = new Rect();
         background.getPadding(rect);
-        final InsetDrawable inset = new InsetDrawable(background, -rect.left, 0, -rect.right, 0);
-        super.setBackground(inset);
+
+        final boolean insetLeft = getResources().getBoolean(R.bool.list_divider_inset_left);
+        if (insetLeft) {
+            super.setBackground(new InsetDrawable(background, -rect.left, 0, -rect.right, 0));
+        } else {
+            super.setBackground(new InsetDrawable(background, -rect.right, 0, -rect.left, 0));
+        }
     }
 
     @Override
diff --git a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java
index 71fd100..eaa74eb 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/IconUtils.java
@@ -45,7 +45,7 @@
         add("application/vnd.android.package-archive", icon);
 
         // Audio
-        icon = R.drawable.ic_doc_audio;
+        icon = R.drawable.ic_doc_audio_dark;
         add("application/ogg", icon);
         add("application/x-flac", icon);
 
@@ -132,7 +132,7 @@
         add("application/x-font-ttf", icon);
 
         // Image
-        icon = R.drawable.ic_doc_image;
+        icon = R.drawable.ic_doc_image_dark;
         add("application/vnd.oasis.opendocument.graphics", icon);
         add("application/vnd.oasis.opendocument.graphics-template", icon);
         add("application/vnd.oasis.opendocument.image", icon);
@@ -186,7 +186,7 @@
         add("application/x-kword", icon);
 
         // Video
-        icon = R.drawable.ic_doc_video;
+        icon = R.drawable.ic_doc_video_dark;
         add("application/x-quicktimeplayer", icon);
         add("application/x-shockwave-flash", icon);
     }
@@ -220,7 +220,7 @@
             if (mode == DocumentsActivity.State.MODE_GRID) {
                 return res.getDrawable(R.drawable.ic_grid_folder);
             } else {
-                return res.getDrawable(R.drawable.ic_root_folder);
+                return res.getDrawable(R.drawable.ic_root_folder_dark);
             }
         }
 
@@ -232,7 +232,7 @@
 
         if (Document.MIME_TYPE_DIR.equals(mimeType)) {
             // TODO: return a mipmap, since this is used for grid
-            return res.getDrawable(R.drawable.ic_root_folder);
+            return res.getDrawable(R.drawable.ic_root_folder_dark);
         }
 
         // Look for exact match first
@@ -249,13 +249,13 @@
         // Otherwise look for partial match
         final String typeOnly = mimeType.split("/")[0];
         if ("audio".equals(typeOnly)) {
-            return res.getDrawable(R.drawable.ic_doc_audio);
+            return res.getDrawable(R.drawable.ic_doc_audio_dark);
         } else if ("image".equals(typeOnly)) {
-            return res.getDrawable(R.drawable.ic_doc_image);
+            return res.getDrawable(R.drawable.ic_doc_image_dark);
         } else if ("text".equals(typeOnly)) {
             return res.getDrawable(R.drawable.ic_doc_text);
         } else if ("video".equals(typeOnly)) {
-            return res.getDrawable(R.drawable.ic_doc_video);
+            return res.getDrawable(R.drawable.ic_doc_video_dark);
         } else {
             return res.getDrawable(R.drawable.ic_doc_generic);
         }
diff --git a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
index caa7581..d06e858 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/RootsCache.java
@@ -103,7 +103,7 @@
         // Special root for recents
         mRecentsRoot.authority = null;
         mRecentsRoot.rootId = null;
-        mRecentsRoot.icon = R.drawable.ic_root_recent;
+        mRecentsRoot.icon = R.drawable.ic_root_recent_dark;
         mRecentsRoot.flags = Root.FLAG_LOCAL_ONLY | Root.FLAG_SUPPORTS_CREATE
                 | Root.FLAG_SUPPORTS_IS_CHILD;
         mRecentsRoot.title = mContext.getString(R.string.root_recent);
diff --git a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
index e220c9e..efa7785 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/model/RootInfo.java
@@ -159,15 +159,15 @@
 
         // TODO: remove these special case icons
         if (isExternalStorage()) {
-            derivedIcon = R.drawable.ic_root_sdcard;
+            derivedIcon = R.drawable.ic_root_sdcard_dark;
         } else if (isDownloads()) {
-            derivedIcon = R.drawable.ic_root_download;
+            derivedIcon = R.drawable.ic_root_download_dark;
         } else if (isImages()) {
-            derivedIcon = R.drawable.ic_doc_image;
+            derivedIcon = R.drawable.ic_doc_image_dark;
         } else if (isVideos()) {
-            derivedIcon = R.drawable.ic_doc_video;
+            derivedIcon = R.drawable.ic_doc_video_dark;
         } else if (isAudio()) {
-            derivedIcon = R.drawable.ic_doc_audio;
+            derivedIcon = R.drawable.ic_doc_audio_dark;
         }
     }
 
diff --git a/packages/Keyguard/res/drawable-hdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-hdpi/ic_alarm_small.png
deleted file mode 100644
index 3819029..0000000
--- a/packages/Keyguard/res/drawable-hdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-mdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-mdpi/ic_alarm_small.png
deleted file mode 100644
index 2aeedaf..0000000
--- a/packages/Keyguard/res/drawable-mdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_alarm_small.png
deleted file mode 100644
index e28b3f6..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-hdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_alarm_small.png
deleted file mode 100644
index f727d01..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-mdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_alarm_small.png
deleted file mode 100644
index d9c0623..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-xhdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png
deleted file mode 100644
index a36bf1f..0000000
--- a/packages/Keyguard/res/drawable-sw600dp-xxhdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-xhdpi/ic_alarm_small.png
deleted file mode 100644
index 0290bdc..0000000
--- a/packages/Keyguard/res/drawable-xhdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable-xxhdpi/ic_alarm_small.png b/packages/Keyguard/res/drawable-xxhdpi/ic_alarm_small.png
deleted file mode 100644
index 66968e8..0000000
--- a/packages/Keyguard/res/drawable-xxhdpi/ic_alarm_small.png
+++ /dev/null
Binary files differ
diff --git a/packages/Keyguard/res/drawable/ic_access_alarms_big.xml b/packages/Keyguard/res/drawable/ic_access_alarms_big.xml
new file mode 100644
index 0000000..84ccb7c
--- /dev/null
+++ b/packages/Keyguard/res/drawable/ic_access_alarms_big.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="18dp"
+    android:height="18dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0">
+
+    <path
+        android:fillColor="@color/clock_gray"
+        android:pathData="M22.0,5.7l-4.6,-3.9l-1.3,1.5l4.6,3.9L22.0,5.7zM7.9,3.4L6.6,1.9L2.0,5.7l1.3,1.5L7.9,3.4zM12.5,8.0L11.0,8.0l0.0,6.0l4.7,2.9l0.8,-1.2l-4.0,-2.4L12.5,8.0zM12.0,4.0c-5.0,0.0 -9.0,4.0 -9.0,9.0c0.0,5.0 4.0,9.0 9.0,9.0s9.0,-4.0 9.0,-9.0C21.0,8.0 17.0,4.0 12.0,4.0zM12.0,20.0c-3.9,0.0 -7.0,-3.1 -7.0,-7.0c0.0,-3.9 3.1,-7.0 7.0,-7.0c3.9,0.0 7.0,3.1 7.0,7.0C19.0,16.9 15.9,20.0 12.0,20.0z"/>
+</vector>
diff --git a/packages/Keyguard/res/drawable/ic_backspace_24dp.xml b/packages/Keyguard/res/drawable/ic_backspace_24dp.xml
index 9e5016d..47c8d14 100644
--- a/packages/Keyguard/res/drawable/ic_backspace_24dp.xml
+++ b/packages/Keyguard/res/drawable/ic_backspace_24dp.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#ffffffff"
+        android:fillColor="#ffffffff"
         android:pathData="M44.0,6.0L14.0,6.0c-1.4,0.0 -2.5,0.7 -3.2,1.8L0.0,24.0l10.8,16.2c0.7,1.1 1.8,1.8 3.2,1.8l30.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L48.0,10.0C48.0,7.8 46.2,6.0 44.0,6.0zM38.0,31.2L35.2,34.0L28.0,26.8L20.8,34.0L18.0,31.2l7.2,-7.2L18.0,16.8l2.8,-2.8l7.2,7.2l7.2,-7.2l2.8,2.8L30.8,24.0L38.0,31.2z"/>
 </vector>
diff --git a/packages/Keyguard/res/layout/keyguard_status_area.xml b/packages/Keyguard/res/layout/keyguard_status_area.xml
index 2730517..7d8977c 100644
--- a/packages/Keyguard/res/layout/keyguard_status_area.xml
+++ b/packages/Keyguard/res/layout/keyguard_status_area.xml
@@ -35,13 +35,11 @@
     <TextView android:id="@+id/alarm_status"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:drawablePadding="2dip"
-        android:drawableLeft="@drawable/ic_alarm_small"
-        android:drawableStart="@drawable/ic_alarm_small"
+        android:drawablePadding="6dp"
+        android:drawableStart="@drawable/ic_access_alarms_big"
         android:textColor="@color/clock_gray"
         style="@style/widget_label"
-        android:layout_marginLeft="8dip"
-        android:layout_marginStart="8dip"
+        android:layout_marginStart="6dp"
         android:gravity="center"
         android:visibility="gone"
         />
diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml
index 09f521a..1e124b8 100644
--- a/packages/Keyguard/res/values-zh-rCN/strings.xml
+++ b/packages/Keyguard/res/values-zh-rCN/strings.xml
@@ -22,9 +22,9 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="app_name" msgid="719438068451601849">"Keyguard"</string>
     <string name="keyguard_password_enter_pin_code" msgid="3037685796058495017">"输入 PIN 码"</string>
-    <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"请输入 SIM 卡 PUK 码和新的 PIN 码"</string>
-    <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM 卡 PUK 码"</string>
-    <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"新 SIM 卡 PIN 码"</string>
+    <string name="keyguard_password_enter_puk_code" msgid="3035856550289724338">"请输入SIM卡PUK码和新的 PIN 码"</string>
+    <string name="keyguard_password_enter_puk_prompt" msgid="1801941051094974609">"SIM卡PUK码"</string>
+    <string name="keyguard_password_enter_pin_prompt" msgid="3201151840570492538">"新SIM卡PIN码"</string>
     <string name="keyguard_password_entry_touch_hint" msgid="7858547464982981384"><font size="17">"触摸可输入密码"</font></string>
     <string name="keyguard_password_enter_password_code" msgid="1054721668279049780">"输入密码以解锁"</string>
     <string name="keyguard_password_enter_pin_password_code" msgid="6391755146112503443">"输入 PIN 进行解锁"</string>
@@ -36,16 +36,16 @@
     <string name="keyguard_low_battery" msgid="8143808018719173859">"请连接充电器。"</string>
     <string name="keyguard_instructions_when_pattern_disabled" msgid="1332288268600329841">"按“菜单”键解锁。"</string>
     <string name="keyguard_network_locked_message" msgid="9169717779058037168">"网络已锁定"</string>
-    <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"无 SIM 卡"</string>
-    <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"平板电脑中没有 SIM 卡。"</string>
-    <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"手机中没有 SIM 卡。"</string>
-    <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"请插入 SIM 卡。"</string>
-    <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM 卡缺失或无法读取,请插入 SIM 卡。"</string>
-    <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"SIM 卡无法使用。"</string>
-    <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"您的 SIM 卡已永久停用。\n请与您的无线服务提供商联系,以便重新获取一张 SIM 卡。"</string>
-    <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 卡已被锁定。"</string>
-    <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡已被 PUK 锁定。"</string>
-    <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解锁 SIM 卡..."</string>
+    <string name="keyguard_missing_sim_message_short" msgid="494980561304211931">"无SIM卡"</string>
+    <string name="keyguard_missing_sim_message" product="tablet" msgid="1445849005909260039">"平板电脑中没有SIM卡。"</string>
+    <string name="keyguard_missing_sim_message" product="default" msgid="3481110395508637643">"手机中没有SIM卡。"</string>
+    <string name="keyguard_missing_sim_instructions" msgid="5210891509995942250">"请插入SIM卡。"</string>
+    <string name="keyguard_missing_sim_instructions_long" msgid="5968985489463870358">"SIM卡缺失或无法读取,请插入SIM卡。"</string>
+    <string name="keyguard_permanent_disabled_sim_message_short" msgid="8340813989586622356">"SIM卡无法使用。"</string>
+    <string name="keyguard_permanent_disabled_sim_instructions" msgid="5892940909699723544">"您的SIM卡已永久停用。\n请与您的无线服务提供商联系,以便重新获取一张SIM卡。"</string>
+    <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM卡已被锁定。"</string>
+    <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM卡已被PUK码锁定。"</string>
+    <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解锁SIM卡..."</string>
     <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的小部件%2$d。"</string>
     <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加小部件。"</string>
     <string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
@@ -106,16 +106,16 @@
     <string name="kg_wrong_pin" msgid="1131306510833563801">"PIN 有误"</string>
     <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"请在 <xliff:g id="NUMBER">%d</xliff:g> 秒后重试。"</string>
     <string name="kg_pattern_instructions" msgid="398978611683075868">"绘制您的图案"</string>
-    <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"输入 SIM PIN"</string>
+    <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"输入SIM卡PIN码"</string>
     <string name="kg_pin_instructions" msgid="2377242233495111557">"输入 PIN"</string>
     <string name="kg_password_instructions" msgid="5753646556186936819">"输入密码"</string>
-    <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM 卡已被停用,需要输入 PUK 码才能继续使用。有关详情,请联系您的运营商。"</string>
+    <string name="kg_puk_enter_puk_hint" msgid="453227143861735537">"SIM卡已被停用,需要输入PUK码才能继续使用。有关详情,请联系您的运营商。"</string>
     <string name="kg_puk_enter_pin_hint" msgid="7871604527429602024">"请输入所需 PIN 码"</string>
     <string name="kg_enter_confirm_pin_hint" msgid="325676184762529976">"请确认所需 PIN 码"</string>
-    <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"正在解锁 SIM 卡..."</string>
+    <string name="kg_sim_unlock_progress_dialog_message" msgid="8950398016976865762">"正在解锁SIM卡..."</string>
     <string name="kg_invalid_sim_pin_hint" msgid="8795159358110620001">"请输入 4 至 8 位数的 PIN。"</string>
-    <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK 码应至少包含 8 位数字。"</string>
-    <string name="kg_invalid_puk" msgid="3638289409676051243">"请重新输入正确的 PUK 码。如果尝试错误次数过多,SIM 卡将永久停用。"</string>
+    <string name="kg_invalid_sim_puk_hint" msgid="7553388325654369575">"PUK码应至少包含8位数字。"</string>
+    <string name="kg_invalid_puk" msgid="3638289409676051243">"请重新输入正确的PUK码。如果尝试错误次数过多,SIM卡将永久停用。"</string>
     <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"PIN 码不匹配"</string>
     <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"图案尝试次数过多"</string>
     <string name="kg_login_instructions" msgid="1100551261265506448">"要解锁,请登录您的 Google 帐户。"</string>
@@ -136,18 +136,18 @@
     <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐户解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
     <string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
     <string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"删除"</string>
-    <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM 卡 PIN 码不正确,您现在必须联系运营商为您解锁设备。"</string>
+    <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"SIM卡PIN码不正确,您现在必须联系运营商为您解锁设备。"</string>
   <plurals name="kg_password_wrong_pin_code">
-    <item quantity="one" msgid="8134313997799638254">"SIM 卡 PIN 码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,则必须联系运营商帮您解锁设备。"</item>
-    <item quantity="other" msgid="2215723361575359486">"SIM 卡 PIN 码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。"</item>
+    <item quantity="one" msgid="8134313997799638254">"SIM卡PIN码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,则必须联系运营商帮您解锁设备。"</item>
+    <item quantity="other" msgid="2215723361575359486">"SIM卡PIN码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。"</item>
   </plurals>
-    <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM 卡无法使用,请与您的运营商联系。"</string>
+    <string name="kg_password_wrong_puk_code_dead" msgid="7077536808291316208">"SIM卡无法使用,请与您的运营商联系。"</string>
   <plurals name="kg_password_wrong_puk_code">
-    <item quantity="one" msgid="3256893607561060649">"SIM 卡 PUK 码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,SIM 卡将永远无法使用。"</item>
-    <item quantity="other" msgid="5477305226026342036">"SIM 卡 PUK 码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,SIM 卡将永远无法使用。"</item>
+    <item quantity="one" msgid="3256893607561060649">"SIM卡PUK码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,SIM卡将永远无法使用。"</item>
+    <item quantity="other" msgid="5477305226026342036">"SIM卡PUK码不正确,您还有<xliff:g id="NUMBER">%d</xliff:g>次尝试机会。如果仍然失败,SIM卡将永远无法使用。"</item>
   </plurals>
-    <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM 卡 PIN 码操作失败!"</string>
-    <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM 卡 PUK 码操作失败!"</string>
+    <string name="kg_password_pin_failed" msgid="6268288093558031564">"SIM卡PIN码操作失败!"</string>
+    <string name="kg_password_puk_failed" msgid="2838824369502455984">"SIM卡PUK码操作失败!"</string>
     <string name="kg_pin_accepted" msgid="1448241673570020097">"代码正确!"</string>
     <string name="keyguard_transport_prev_description" msgid="8229108430245669854">"“上一曲”按钮"</string>
     <string name="keyguard_transport_next_description" msgid="4299258300283778305">"“下一曲”按钮"</string>
diff --git a/packages/Keyguard/res/values/donottranslate.xml b/packages/Keyguard/res/values/donottranslate.xml
index 78636db..2f54406 100644
--- a/packages/Keyguard/res/values/donottranslate.xml
+++ b/packages/Keyguard/res/values/donottranslate.xml
@@ -18,6 +18,9 @@
     <!-- Skeleton string format for displaying the date. -->
     <string name="abbrev_wday_month_day_no_year">EEEEMMMMd</string>
 
+    <!-- Skeleton string format for displaying the date when an alarm is set. -->
+    <string name="abbrev_wday_month_day_no_year_alarm">EEEMMMMd</string>
+
     <!-- Skeleton string format for displaying the time in 12-hour format. -->
     <string name="clock_12hr_format">hm</string>
 
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java
index 02a441b..daba0a2 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardStatusView.java
@@ -71,6 +71,12 @@
         public void onScreenTurnedOff(int why) {
             setEnableMarquee(false);
         }
+
+        @Override
+        public void onUserSwitchComplete(int userId) {
+            refresh();
+            updateOwnerInfo();
+        }
     };
 
     public KeyguardStatusView(Context context) {
@@ -110,7 +116,8 @@
     }
 
     protected void refresh() {
-        Patterns.update(mContext);
+        AlarmClockInfo nextAlarm = mLockPatternUtils.getNextAlarm();
+        Patterns.update(mContext, nextAlarm != null);
 
         mDateView.setFormat24Hour(Patterns.dateView);
         mDateView.setFormat12Hour(Patterns.dateView);
@@ -118,25 +125,23 @@
         mClockView.setFormat12Hour(Patterns.clockView12);
         mClockView.setFormat24Hour(Patterns.clockView24);
 
-        refreshAlarmStatus();
+        refreshAlarmStatus(nextAlarm);
     }
 
-    void refreshAlarmStatus() {
-        // Update Alarm status
-        AlarmClockInfo nextAlarm = mLockPatternUtils.getNextAlarm();
+    void refreshAlarmStatus(AlarmClockInfo nextAlarm) {
         if (nextAlarm != null) {
-            mAlarmStatusView.setText(formatNextAlarm(nextAlarm));
+            mAlarmStatusView.setText(formatNextAlarm(mContext, nextAlarm));
             mAlarmStatusView.setVisibility(View.VISIBLE);
         } else {
             mAlarmStatusView.setVisibility(View.GONE);
         }
     }
 
-    String formatNextAlarm(AlarmClockInfo info) {
+    public static String formatNextAlarm(Context context, AlarmClockInfo info) {
         if (info == null) {
             return "";
         }
-        String skeleton = DateFormat.is24HourFormat(mContext) ? "EHm" : "Ehma";
+        String skeleton = DateFormat.is24HourFormat(context) ? "EHm" : "Ehma";
         String pattern = DateFormat.getBestDateTimePattern(Locale.getDefault(), skeleton);
         return DateFormat.format(pattern, info.getTriggerTime()).toString();
     }
@@ -191,10 +196,12 @@
         static String clockView24;
         static String cacheKey;
 
-        static void update(Context context) {
+        static void update(Context context, boolean hasAlarm) {
             final Locale locale = Locale.getDefault();
             final Resources res = context.getResources();
-            final String dateViewSkel = res.getString(R.string.abbrev_wday_month_day_no_year);
+            final String dateViewSkel = res.getString(hasAlarm
+                    ? R.string.abbrev_wday_month_day_no_year_alarm
+                    : R.string.abbrev_wday_month_day_no_year);
             final String clockView12Skel = res.getString(R.string.clock_12hr_format);
             final String clockView24Skel = res.getString(R.string.clock_24hr_format);
             final String key = locale.toString() + dateViewSkel + clockView12Skel + clockView24Skel;
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
index a5dbbcb..f0f5772 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java
@@ -17,6 +17,7 @@
 package com.android.keyguard;
 
 import android.app.ActivityManagerNative;
+import android.app.AlarmManager;
 import android.app.IUserSwitchObserver;
 import android.app.PendingIntent;
 import android.app.admin.DevicePolicyManager;
@@ -322,7 +323,8 @@
 
             if (Intent.ACTION_TIME_TICK.equals(action)
                     || Intent.ACTION_TIME_CHANGED.equals(action)
-                    || Intent.ACTION_TIMEZONE_CHANGED.equals(action)) {
+                    || Intent.ACTION_TIMEZONE_CHANGED.equals(action)
+                    || AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(action)) {
                 mHandler.sendEmptyMessage(MSG_TIME_UPDATE);
             } else if (TelephonyIntents.SPN_STRINGS_UPDATED_ACTION.equals(action)) {
                 mTelephonyPlmn = getTelephonyPlmnFrom(intent);
@@ -568,6 +570,7 @@
         filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
         filter.addAction(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED);
         filter.addAction(Intent.ACTION_USER_REMOVED);
+        filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
         context.registerReceiver(mBroadcastReceiver, filter);
 
         final IntentFilter bootCompleteFilter = new IntentFilter();
diff --git a/packages/SystemUI/res/drawable/ic_access_alarms_small.xml b/packages/SystemUI/res/drawable/ic_access_alarms_small.xml
new file mode 100644
index 0000000..cf64689
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_access_alarms_small.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 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.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+    android:width="16dp"
+    android:height="16dp"
+    android:viewportWidth="24.0"
+    android:viewportHeight="24.0">
+
+    <path
+        android:fillColor="#64ffffff"
+        android:pathData="M22.0,5.7l-4.6,-3.9l-1.3,1.5l4.6,3.9L22.0,5.7zM7.9,3.4L6.6,1.9L2.0,5.7l1.3,1.5L7.9,3.4zM12.5,8.0L11.0,8.0l0.0,6.0l4.7,2.9l0.8,-1.2l-4.0,-2.4L12.5,8.0zM12.0,4.0c-5.0,0.0 -9.0,4.0 -9.0,9.0c0.0,5.0 4.0,9.0 9.0,9.0s9.0,-4.0 9.0,-9.0C21.0,8.0 17.0,4.0 12.0,4.0zM12.0,20.0c-3.9,0.0 -7.0,-3.1 -7.0,-7.0c0.0,-3.9 3.1,-7.0 7.0,-7.0c3.9,0.0 7.0,3.1 7.0,7.0C19.0,16.9 15.9,20.0 12.0,20.0z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_account_circle.xml b/packages/SystemUI/res/drawable/ic_account_circle.xml
index 4a4c1c1..d8649e5 100644
--- a/packages/SystemUI/res/drawable/ic_account_circle.xml
+++ b/packages/SystemUI/res/drawable/ic_account_circle.xml
@@ -13,14 +13,11 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <group
         android:scaleX="1.2"
@@ -28,7 +25,7 @@
         android:pivotX="12.0"
         android:pivotY="12.0">
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M12.0,2.0C6.5,2.0 2.0,6.5 2.0,12.0s4.5,10.0 10.0,10.0c5.5,0.0 10.0,-4.5 10.0,-10.0S17.5,2.0 12.0,2.0zM12.0,5.0c1.7,0.0 3.0,1.3 3.0,3.0c0.0,1.7 -1.3,3.0 -3.0,3.0c-1.7,0.0 -3.0,-1.3 -3.0,-3.0C9.0,6.3 10.3,5.0 12.0,5.0zM12.0,19.2c-2.5,0.0 -4.7,-1.3 -6.0,-3.2c0.0,-2.0 4.0,-3.1 6.0,-3.1c2.0,0.0 6.0,1.1 6.0,3.1C16.7,17.9 14.5,19.2 12.0,19.2z"/>
     </group>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_account_circle_qs_muted.xml b/packages/SystemUI/res/drawable/ic_account_circle_qs_muted.xml
index afcddf1..7b8b89f 100644
--- a/packages/SystemUI/res/drawable/ic_account_circle_qs_muted.xml
+++ b/packages/SystemUI/res/drawable/ic_account_circle_qs_muted.xml
@@ -16,14 +16,11 @@
   ~ limitations under the License
   -->
 
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <group
         android:scaleX="1.2"
@@ -31,7 +28,7 @@
         android:pivotX="12.0"
         android:pivotY="12.0">
     <path
-        android:fill="@color/qs_user_detail_icon_muted"
+        android:fillColor="@color/qs_user_detail_icon_muted"
         android:pathData="M12.0,2.0C6.5,2.0 2.0,6.5 2.0,12.0s4.5,10.0 10.0,10.0c5.5,0.0 10.0,-4.5 10.0,-10.0S17.5,2.0 12.0,2.0zM12.0,5.0c1.7,0.0 3.0,1.3 3.0,3.0c0.0,1.7 -1.3,3.0 -3.0,3.0c-1.7,0.0 -3.0,-1.3 -3.0,-3.0C9.0,6.3 10.3,5.0 12.0,5.0zM12.0,19.2c-2.5,0.0 -4.7,-1.3 -6.0,-3.2c0.0,-2.0 4.0,-3.1 6.0,-3.1c2.0,0.0 6.0,1.1 6.0,3.1C16.7,17.9 14.5,19.2 12.0,19.2z"/>
     </group>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_chevron_left.xml b/packages/SystemUI/res/drawable/ic_chevron_left.xml
index 27c2034..379382b 100644
--- a/packages/SystemUI/res/drawable/ic_chevron_left.xml
+++ b/packages/SystemUI/res/drawable/ic_chevron_left.xml
@@ -13,16 +13,13 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
   -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="36.0"
-        android:viewportHeight="36.0"/>
+        android:viewportHeight="36.0">
 
     <path
-        android:fill="#ffffffff"
+        android:fillColor="#ffffffff"
         android:pathData="M23.1,11.1l-2.1000004,-2.1000004 -9.0,9.0 9.0,9.0 2.1000004,-2.1000004 -6.8999996,-6.8999996z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_clear_all.xml b/packages/SystemUI/res/drawable/ic_clear_all.xml
index b0f3a5a..187a420 100644
--- a/packages/SystemUI/res/drawable/ic_clear_all.xml
+++ b/packages/SystemUI/res/drawable/ic_clear_all.xml
@@ -13,16 +13,13 @@
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License
   -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M10.0,26.0l28.0,0.0l0.0,-4.0L10.0,22.0L10.0,26.0zM6.0,34.0l28.0,0.0l0.0,-4.0L6.0,30.0L6.0,34.0zM14.0,14.0l0.0,4.0l28.0,0.0l0.0,-4.0L14.0,14.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock_24dp.xml b/packages/SystemUI/res/drawable/ic_lock_24dp.xml
index b2e486c..204af7e 100644
--- a/packages/SystemUI/res/drawable/ic_lock_24dp.xml
+++ b/packages/SystemUI/res/drawable/ic_lock_24dp.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="@color/keyguard_affordance"
+        android:fillColor="@color/keyguard_affordance"
         android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.8 -2.2,-5.0 -5.0,-5.0C9.2,1.0 7.0,3.2 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM12.0,17.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0c1.1,0.0 2.0,0.9 2.0,2.0S13.1,17.0 12.0,17.0zM15.1,8.0L8.9,8.0L8.9,6.0c0.0,-1.7 1.4,-3.1 3.1,-3.1c1.7,0.0 3.1,1.4 3.1,3.1L15.1,8.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml b/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml
index 28b16dd..c877f06 100644
--- a/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml
+++ b/packages/SystemUI/res/drawable/ic_lock_open_24dp.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="@color/keyguard_affordance"
+        android:fillColor="@color/keyguard_affordance"
         android:pathData="M12.0,17.0c1.1,0.0 2.0,-0.9 2.0,-2.0s-0.9,-2.0 -2.0,-2.0c-1.1,0.0 -2.0,0.9 -2.0,2.0S10.9,17.0 12.0,17.0zM18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.8 -2.2,-5.0 -5.0,-5.0C9.2,1.0 7.0,3.2 7.0,6.0l1.9,0.0c0.0,-1.7 1.4,-3.1 3.1,-3.1c1.7,0.0 3.1,1.4 3.1,3.1l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM18.0,20.0L6.0,20.0L6.0,10.0l12.0,0.0L18.0,20.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_lock_to_app_24dp.xml b/packages/SystemUI/res/drawable/ic_lock_to_app_24dp.xml
index e5737ee..2d77949 100644
--- a/packages/SystemUI/res/drawable/ic_lock_to_app_24dp.xml
+++ b/packages/SystemUI/res/drawable/ic_lock_to_app_24dp.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="@color/recents_task_view_lock_to_app_button_color"
+        android:fillColor="@color/recents_task_view_lock_to_app_button_color"
         android:pathData="M18.0,8.0l-1.0,0.0L17.0,6.0c0.0,-2.8 -2.2,-5.0 -5.0,-5.0C9.2,1.0 7.0,3.2 7.0,6.0l0.0,2.0L6.0,8.0c-1.1,0.0 -2.0,0.9 -2.0,2.0l0.0,10.0c0.0,1.1 0.9,2.0 2.0,2.0l12.0,0.0c1.1,0.0 2.0,-0.9 2.0,-2.0L20.0,10.0C20.0,8.9 19.1,8.0 18.0,8.0zM12.0,17.0c-1.1,0.0 -2.0,-0.9 -2.0,-2.0s0.9,-2.0 2.0,-2.0c1.1,0.0 2.0,0.9 2.0,2.0S13.1,17.0 12.0,17.0zM15.1,8.0L8.9,8.0L8.9,6.0c0.0,-1.7 1.4,-3.1 3.1,-3.1c1.7,0.0 3.1,1.4 3.1,3.1L15.1,8.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_power_low.xml b/packages/SystemUI/res/drawable/ic_power_low.xml
index 5bb7aba..ba99948 100644
--- a/packages/SystemUI/res/drawable/ic_power_low.xml
+++ b/packages/SystemUI/res/drawable/ic_power_low.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M30.0,6.0L30.0,2.0L18.0,2.0l0.0,4.0l-8.0,0.0l0.0,40.0l28.0,0.0L38.0,6.0L30.0,6.0zM26.0,37.0l-4.0,0.0l0.0,-4.0l4.0,0.0L26.0,37.0zM26.0,30.0l-4.0,0.0L22.0,15.0l4.0,0.0L26.0,30.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_power_saver.xml b/packages/SystemUI/res/drawable/ic_power_saver.xml
index 26e7375..2162d79 100644
--- a/packages/SystemUI/res/drawable/ic_power_saver.xml
+++ b/packages/SystemUI/res/drawable/ic_power_saver.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M30.0,6.0L30.0,2.0L18.0,2.0l0.0,4.0l-8.0,0.0l0.0,40.0l28.0,0.0L38.0,6.0L30.0,6.0zM32.0,28.0l-6.0,0.0l0.0,6.0l-4.0,0.0l0.0,-6.0l-6.0,0.0l0.0,-4.0l6.0,0.0l0.0,-6.0l4.0,0.0l0.0,6.0l6.0,0.0L32.0,28.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_airplane_off.xml b/packages/SystemUI/res/drawable/ic_qs_airplane_off.xml
index c68238f..79a9d409 100644
--- a/packages/SystemUI/res/drawable/ic_qs_airplane_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_airplane_off.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M26.0,18.0L26.0,7.0c0.0,-1.7 -1.3,-3.0 -3.0,-3.0c-1.7,0.0 -3.0,1.3 -3.0,3.0l0.0,7.4L35.7,30.0l6.3,2.0l0.0,-4.0L26.0,18.0zM6.0,10.5l10.0,10.0L4.0,28.0l0.0,4.0l16.0,-5.0l0.0,11.0l-4.0,3.0l0.0,3.0l7.0,-2.0l7.0,2.0l0.0,-3.0l-4.0,-3.0l0.0,-7.5L37.5,42.0l2.5,-2.5L8.5,8.0L6.0,10.5z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_airplane_on.xml b/packages/SystemUI/res/drawable/ic_qs_airplane_on.xml
index c1e3c7e..5d5d257 100644
--- a/packages/SystemUI/res/drawable/ic_qs_airplane_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_airplane_on.xml
@@ -13,19 +13,16 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M20.4,18.0"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M42.0,32.0l0.0,-4.0L26.0,18.0L26.0,7.0c0.0,-1.7 -1.3,-3.0 -3.0,-3.0c-1.7,0.0 -3.0,1.3 -3.0,3.0l0.0,11.0L4.0,28.0l0.0,4.0l16.0,-5.0l0.0,11.0l-4.0,3.0l0.0,3.0l7.0,-2.0l7.0,2.0l0.0,-3.0l-4.0,-3.0L26.0,27.0L42.0,32.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_back.xml b/packages/SystemUI/res/drawable/ic_qs_back.xml
index 52039f5..f00ba03 100644
--- a/packages/SystemUI/res/drawable/ic_qs_back.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_back.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M20.0,11.0L7.8,11.0l5.6,-5.6L12.0,4.0l-8.0,8.0l8.0,8.0l1.4,-1.4L7.8,13.0L20.0,13.0L20.0,11.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml
index 3957d02..0c65389 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connected.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M14.0,24.0l-4.0,-4.0l-4.0,4.0l4.0,4.0L14.0,24.0zM35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6zM38.0,20.0l-4.0,4.0l4.0,4.0l4.0,-4.0L38.0,20.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml
index e4038f9..b9a315c 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_connecting.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M28.5,24.0l4.6,4.6c0.6,-1.4 0.9,-3.0 0.9,-4.7c0.0,-1.6 -0.3,-3.2 -0.9,-4.6L28.5,24.0zM39.1,13.4L36.5,16.0c1.3,2.4 2.0,5.1 2.0,8.0s-0.7,5.6 -2.0,8.0l2.4,2.4c1.9,-3.1 3.1,-6.7 3.1,-10.6C42.0,20.0 40.9,16.5 39.1,13.4zM31.4,15.4L20.0,4.0l-2.0,0.0l0.0,15.2L8.8,10.0L6.0,12.8L17.2,24.0L6.0,35.2L8.8,38.0l9.2,-9.2L18.0,44.0l2.0,0.0l11.4,-11.4L22.8,24.0L31.4,15.4zM22.0,11.7l3.8,3.8L22.0,19.2L22.0,11.7zM25.8,32.6L22.0,36.3l0.0,-7.5L25.8,32.6z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_detail_empty.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_detail_empty.xml
index aa0b369..dd92126 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_detail_empty.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_detail_empty.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="56dp"
-        android:height="56dp"/>
-
-    <viewport
+        android:height="56dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="@color/qs_detail_empty"
+        android:fillColor="@color/qs_detail_empty"
         android:pathData="M35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_off.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_off.xml
index 00c5af8..0cb1f32 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_off.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M26.0,11.8l3.8,3.8l-3.2,3.2l2.8,2.8l6.0,-6.0L24.0,4.2l-2.0,0.0l0.0,10.1l4.0,4.0L26.0,11.8zM10.8,8.2L8.0,11.0l13.2,13.2L10.0,35.3l2.8,2.8L22.0,29.0l0.0,15.2l2.0,0.0l8.6,-8.6l4.6,4.6l2.8,-2.8L10.8,8.2zM26.0,36.5L26.0,29.0l3.8,3.8L26.0,36.5z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bluetooth_on.xml b/packages/SystemUI/res/drawable/ic_qs_bluetooth_on.xml
index 2b14f33..9a68dad 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bluetooth_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bluetooth_on.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_bugreport.xml b/packages/SystemUI/res/drawable/ic_qs_bugreport.xml
index 2958848..0df1a96 100644
--- a/packages/SystemUI/res/drawable/ic_qs_bugreport.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_bugreport.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M20.0,8.0l-2.8,0.0c-0.5,-0.8 -1.1,-1.5 -1.8,-2.0L17.0,4.4L15.6,3.0l-2.2,2.2C13.0,5.1 12.5,5.0 12.0,5.0s-1.0,0.1 -1.4,0.2L8.4,3.0L7.0,4.4L8.6,6.0C7.9,6.5 7.3,7.2 6.8,8.0L4.0,8.0l0.0,2.0l2.1,0.0C6.0,10.3 6.0,10.7 6.0,11.0l0.0,1.0L4.0,12.0l0.0,2.0l2.0,0.0l0.0,1.0c0.0,0.3 0.0,0.7 0.1,1.0L4.0,16.0l0.0,2.0l2.8,0.0c1.0,1.8 3.0,3.0 5.2,3.0s4.2,-1.2 5.2,-3.0L20.0,18.0l0.0,-2.0l-2.1,0.0c0.1,-0.3 0.1,-0.7 0.1,-1.0l0.0,-1.0l2.0,0.0l0.0,-2.0l-2.0,0.0l0.0,-1.0c0.0,-0.3 0.0,-0.7 -0.1,-1.0L20.0,10.0L20.0,8.0zM14.0,16.0l-4.0,0.0l0.0,-2.0l4.0,0.0L14.0,16.0zM14.0,12.0l-4.0,0.0l0.0,-2.0l4.0,0.0L14.0,12.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_cancel.xml b/packages/SystemUI/res/drawable/ic_qs_cancel.xml
index de72f13..e4f4174 100644
--- a/packages/SystemUI/res/drawable/ic_qs_cancel.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_cancel.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M24.0,4.0C12.9,4.0 4.0,12.9 4.0,24.0s8.9,20.0 20.0,20.0c11.1,0.0 20.0,-8.9 20.0,-20.0S35.1,4.0 24.0,4.0zM34.0,31.2L31.2,34.0L24.0,26.8L16.8,34.0L14.0,31.2l7.2,-7.2L14.0,16.8l2.8,-2.8l7.2,7.2l7.2,-7.2l2.8,2.8L26.8,24.0L34.0,31.2z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_cast_detail_empty.xml b/packages/SystemUI/res/drawable/ic_qs_cast_detail_empty.xml
index fbc21d4..59dcea2 100644
--- a/packages/SystemUI/res/drawable/ic_qs_cast_detail_empty.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_cast_detail_empty.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="56dp"
-        android:height="56dp"/>
-
-    <viewport
+        android:height="56dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="@color/qs_detail_empty"
+        android:fillColor="@color/qs_detail_empty"
         android:pathData="M42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,6.0l4.0,0.0l0.0,-6.0l36.0,0.0l0.0,28.0L28.0,38.0l0.0,4.0l14.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0zM2.0,36.0l0.0,6.0l6.0,0.0C8.0,38.7 5.3,36.0 2.0,36.0zM2.0,28.0l0.0,4.0c5.5,0.0 10.0,4.5 10.0,10.0l4.0,0.0C16.0,34.3 9.7,28.0 2.0,28.0zM2.0,20.0l0.0,4.0c9.9,0.0 18.0,8.1 18.0,18.0l4.0,0.0C24.0,29.8 14.1,20.0 2.0,20.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_cast_off.xml b/packages/SystemUI/res/drawable/ic_qs_cast_off.xml
index 2a9541e..8051795 100644
--- a/packages/SystemUI/res/drawable/ic_qs_cast_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_cast_off.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,6.0l4.0,0.0l0.0,-6.0l36.0,0.0l0.0,28.0L28.0,38.0l0.0,4.0l14.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0zM2.0,36.0l0.0,6.0l6.0,0.0C8.0,38.7 5.3,36.0 2.0,36.0zM2.0,28.0l0.0,4.0c5.5,0.0 10.0,4.5 10.0,10.0l4.0,0.0C16.0,34.3 9.7,28.0 2.0,28.0zM2.0,20.0l0.0,4.0c9.9,0.0 18.0,8.1 18.0,18.0l4.0,0.0C24.0,29.8 14.1,20.0 2.0,20.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_cast_on.xml b/packages/SystemUI/res/drawable/ic_qs_cast_on.xml
index 159bf65..794eb9e 100644
--- a/packages/SystemUI/res/drawable/ic_qs_cast_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_cast_on.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M2.0,36.0l0.0,6.0l6.0,0.0C8.0,38.7 5.3,36.0 2.0,36.0zM2.0,28.0l0.0,4.0c5.5,0.0 10.0,4.5 10.0,10.0l4.0,0.0C16.0,34.3 9.7,28.0 2.0,28.0zM38.0,14.0L10.0,14.0l0.0,3.3c7.9,2.6 14.2,8.8 16.7,16.7L38.0,34.0L38.0,14.0zM2.0,20.0l0.0,4.0c9.9,0.0 18.0,8.1 18.0,18.0l4.0,0.0C24.0,29.8 14.1,20.0 2.0,20.0zM42.0,6.0L6.0,6.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,6.0l4.0,0.0l0.0,-6.0l36.0,0.0l0.0,28.0L28.0,38.0l0.0,4.0l14.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,10.0C46.0,7.8 44.2,6.0 42.0,6.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_flashlight_off.xml b/packages/SystemUI/res/drawable/ic_qs_flashlight_off.xml
index 0f30be2..d4bd76f 100644
--- a/packages/SystemUI/res/drawable/ic_qs_flashlight_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_flashlight_off.xml
@@ -13,22 +13,19 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64.0dp"
-        android:height="64.0dp"/>
-
-    <viewport
+        android:height="64.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M14.708,11.394l14.899,14.9l0.0,-6.771c4.359,-2.353 3.831,-7.489 3.831,-7.489l0.0,-0.64L14.708,11.393998z"/>
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M14.568,4.0l18.87,0.0l0.0,3.917l-18.87,0.0z"/>
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M38.284,39.427l-29.767,-29.766998 -2.4750004,2.4750004 12.351999,12.351 0.0,19.514 11.213001,0.0 0.0,-8.300999 6.2019978,6.2019997z"/>
 </vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_qs_flashlight_on.xml b/packages/SystemUI/res/drawable/ic_qs_flashlight_on.xml
index 2e9d401..5514b44c 100644
--- a/packages/SystemUI/res/drawable/ic_qs_flashlight_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_flashlight_on.xml
@@ -13,19 +13,16 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64.0dp"
-        android:height="64.0dp"/>
-
-    <viewport
+        android:height="64.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M33.438,12.034l0.0,-0.64l-18.87,0.0l0.0,0.64c0.0,0.0 -0.581,5.189 3.826,7.523L18.394,44.0l11.213,0.0L29.606998,19.523C33.966,17.17 33.438,12.034 33.438,12.034zM24.0,27.697c-1.523,0.0 -2.757,-1.234 -2.757,-2.757c0.0,-1.523 1.234,-2.757 2.757,-2.757c1.523,0.0 2.757,1.234 2.757,2.757C26.757,26.462 25.523,27.697 24.0,27.697z"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M14.568,4.0l18.87,0.0l0.0,3.917l-18.87,0.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml b/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml
index 0a00d14..d68ee4c 100644
--- a/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_hotspot_off.xml
@@ -13,16 +13,12 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64.0dp"
-        android:height="64.0dp"/>
-
-    <viewport
+        android:height="64.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
-
+        android:viewportHeight="48.0">
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M35.099998,28.500000c0.600000,-1.400000 0.900000,-2.900000 0.900000,-4.500000c0.000000,-6.600000 -5.400000,-12.000000 -12.000000,-12.000000c-1.600000,0.000000 -3.100000,0.300000 -4.500000,0.900000l3.200000,3.200000c0.400000,-0.100000 0.800000,-0.100000 1.200000,-0.100000c4.400000,0.000000 8.000000,3.600000 8.000000,8.000000c0.000000,0.400000 0.000000,0.800000 -0.100000,1.300000L35.099998,28.500000zM24.000000,8.000000c8.800000,0.000000 16.000000,7.200000 16.000000,16.000000c0.000000,2.700000 -0.700000,5.200000 -1.900000,7.500000l2.900000,2.900000c1.900000,-3.000000 3.000000,-6.600000 3.000000,-10.400000c0.000000,-11.000000 -9.000000,-20.000000 -20.000000,-20.000000c-3.800000,0.000000 -7.400000,1.100000 -10.400000,2.900000l2.900000,2.900000C18.700001,8.700000 21.299999,8.000000 24.000000,8.000000zM6.500000,5.000000L4.000000,7.500000l4.200000,4.200000C5.600000,15.100000 4.000000,19.400000 4.000000,24.000000c0.000000,7.400000 4.000000,13.800000 10.000000,17.299999l2.000000,-3.500000c-4.800000,-2.800000 -8.000000,-7.900000 -8.000000,-13.800000c0.000000,-3.500000 1.100000,-6.800000 3.100000,-9.400000l2.900000,2.900000C12.700000,19.400000 12.000000,21.600000 12.000000,24.000000c0.000000,4.400000 2.400000,8.300000 6.000000,10.400000l2.000000,-3.500000c-2.400000,-1.400000 -4.000000,-3.900000 -4.000000,-6.900000c0.000000,-1.300000 0.300000,-2.500000 0.900000,-3.600000l3.200000,3.200000c0.000000,0.100000 0.000000,0.300000 0.000000,0.400000c0.000000,2.200000 1.800000,4.000000 4.000000,4.000000c0.100000,0.000000 0.300000,0.000000 0.400000,0.000000l0.000000,0.000000l0.000000,0.000000l15.000000,15.000000l2.500000,-2.500000L8.500000,7.000000L6.500000,5.000000z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml b/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml
index 01cb0ab..da09f6e 100644
--- a/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_hotspot_on.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64.0dp"
-        android:height="64.0dp"/>
-
-    <viewport
+        android:height="64.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M24.000000,22.000000c-2.200000,0.000000 -4.000000,1.800000 -4.000000,4.000000c0.000000,2.200000 1.800000,4.000000 4.000000,4.000000c2.200000,0.000000 4.000000,-1.800000 4.000000,-4.000000C28.000000,23.799999 26.200001,22.000000 24.000000,22.000000zM36.000000,26.000000c0.000000,-6.600000 -5.400000,-12.000000 -12.000000,-12.000000c-6.600000,0.000000 -12.000000,5.400000 -12.000000,12.000000c0.000000,4.400000 2.400000,8.300000 6.000000,10.400000l2.000000,-3.500000c-2.400000,-1.400000 -4.000000,-3.900000 -4.000000,-6.900000c0.000000,-4.400000 3.600000,-8.000000 8.000000,-8.000000s8.000000,3.600000 8.000000,8.000000c0.000000,3.000000 -1.600000,5.500000 -4.000000,6.900000l2.000000,3.500000C33.599998,34.299999 36.000000,30.400000 36.000000,26.000000zM24.000000,6.000000C13.000000,6.000000 4.000000,15.000000 4.000000,26.000000c0.000000,7.400000 4.000000,13.800000 10.000000,17.299999l2.000000,-3.500000c-4.800000,-2.800000 -8.000000,-7.900000 -8.000000,-13.800000c0.000000,-8.800000 7.200000,-16.000000 16.000000,-16.000000s16.000000,7.200000 16.000000,16.000000c0.000000,5.900000 -3.200000,11.100000 -8.000000,13.800000l2.000000,3.500000c6.000000,-3.500000 10.000000,-9.900000 10.000000,-17.299999C44.000000,15.000000 35.000000,6.000000 24.000000,6.000000z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_inversion_off.xml b/packages/SystemUI/res/drawable/ic_qs_inversion_off.xml
index b6a5cad..4237b63 100644
--- a/packages/SystemUI/res/drawable/ic_qs_inversion_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_inversion_off.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M41.3,41.7L36.6,37.0L24.0,24.5l-7.1,-7.1L14.0,14.5L8.5,9.0L6.0,11.5l5.6,5.6c-5.1,6.3 -4.7,15.5 1.1,21.4c3.1,3.1 7.2,4.7 11.3,4.7c3.6,0.0 7.1,-1.2 10.1,-3.6l5.4,5.4l2.5,-2.5L41.3,41.7zM24.0,39.2c-3.2,0.0 -6.2,-1.2 -8.5,-3.5c-2.3,-2.3 -3.5,-5.3 -3.5,-8.5c0.0,-2.6 0.9,-5.1 2.4,-7.2l9.6,9.6L24.0,39.2zM24.0,10.2l0.0,9.2l14.5,14.5c2.7,-5.9 1.7,-13.1 -3.2,-18.0L24.0,4.5l0.0,0.0l0.0,0.0L16.6,12.0l2.8,2.8L24.0,10.2z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_inversion_on.xml b/packages/SystemUI/res/drawable/ic_qs_inversion_on.xml
index e8d59e0..860e769 100644
--- a/packages/SystemUI/res/drawable/ic_qs_inversion_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_inversion_on.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M35.3,15.9L24.0,4.5l0.0,0.0l0.0,0.0L12.7,15.9c-6.2,6.2 -6.2,16.4 0.0,22.6c3.1,3.1 7.2,4.7 11.3,4.7s8.2,-1.6 11.3,-4.7C41.6,32.2 41.6,22.1 35.3,15.9zM24.0,39.2L24.0,39.2c-3.2,0.0 -6.2,-1.2 -8.5,-3.5c-2.3,-2.3 -3.5,-5.3 -3.5,-8.5s1.2,-6.2 3.5,-8.5l8.5,-8.5L24.0,39.2z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_location_off.xml b/packages/SystemUI/res/drawable/ic_qs_location_off.xml
index 26ebfbf..e0fe12e 100644
--- a/packages/SystemUI/res/drawable/ic_qs_location_off.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_location_off.xml
@@ -13,19 +13,16 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M24.0,13.0c2.8,0.0 5.0,2.2 5.0,5.0c0.0,1.5 -0.7,2.8 -1.7,3.7l7.3,7.3c2.0,-3.7 3.4,-7.6 3.4,-11.0c0.0,-7.7 -6.3,-14.0 -14.0,-14.0c-4.0,0.0 -7.5,1.6 -10.1,4.3l6.4,6.4C21.2,13.6 22.5,13.0 24.0,13.0zM32.7,32.2l-9.3,-9.3l-0.2,-0.2L6.5,6.0L4.0,8.5l6.4,6.4c-0.2,1.0 -0.4,2.0 -0.4,3.1c0.0,10.5 14.0,26.0 14.0,26.0s3.3,-3.7 6.8,-8.7l6.7,6.7l2.5,-2.5L32.7,32.2z"/>
     <path
         android:pathData="M23.5,22.9l0.0,0.0 -0.20000076,-0.19999886z"
-        android:fill="#4DFFFFFF"/>
+        android:fillColor="#4DFFFFFF"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_location_on.xml b/packages/SystemUI/res/drawable/ic_qs_location_on.xml
index bc73005..6a7cd53 100644
--- a/packages/SystemUI/res/drawable/ic_qs_location_on.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_location_on.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M24.0,4.0c-7.7,0.0 -14.0,6.3 -14.0,14.0c0.0,10.5 14.0,26.0 14.0,26.0s14.0,-15.5 14.0,-26.0C38.0,10.3 31.7,4.0 24.0,4.0zM24.0,23.0c-2.8,0.0 -5.0,-2.2 -5.0,-5.0s2.2,-5.0 5.0,-5.0c2.8,0.0 5.0,2.2 5.0,5.0S26.8,23.0 24.0,23.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_minus.xml b/packages/SystemUI/res/drawable/ic_qs_minus.xml
index 7b76e0f..4722c9e 100644
--- a/packages/SystemUI/res/drawable/ic_qs_minus.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_minus.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M24.0,4.0C13.0,4.0 4.0,13.0 4.0,24.0s9.0,20.0 20.0,20.0c11.0,0.0 20.0,-9.0 20.0,-20.0S35.0,4.0 24.0,4.0zM34.0,26.0L14.0,26.0l0.0,-4.0l20.0,0.0L34.0,26.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_plus.xml b/packages/SystemUI/res/drawable/ic_qs_plus.xml
index 4b9f506..17d74cf 100644
--- a/packages/SystemUI/res/drawable/ic_qs_plus.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_plus.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24dp"
-        android:height="24dp"/>
-
-    <viewport
+        android:height="24dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M24.0,4.0C13.0,4.0 4.0,13.0 4.0,24.0s9.0,20.0 20.0,20.0c11.0,0.0 20.0,-9.0 20.0,-20.0S35.0,4.0 24.0,4.0zM34.0,26.0l-8.0,0.0l0.0,8.0l-4.0,0.0l0.0,-8.0l-8.0,0.0l0.0,-4.0l8.0,0.0l0.0,-8.0l4.0,0.0l0.0,8.0l8.0,0.0L34.0,26.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_ringer_audible.xml b/packages/SystemUI/res/drawable/ic_qs_ringer_audible.xml
index 787eec5..9c5983d 100644
--- a/packages/SystemUI/res/drawable/ic_qs_ringer_audible.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_ringer_audible.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,16.0l0.0,-5.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0L18.0,16.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_ringer_silent.xml b/packages/SystemUI/res/drawable/ic_qs_ringer_silent.xml
index dd6be76..904ccdf 100644
--- a/packages/SystemUI/res/drawable/ic_qs_ringer_silent.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_ringer_silent.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,10.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7C9.5,4.3 9.0,4.5 8.6,4.7l9.4,9.4L18.0,10.5zM17.7,19.0l2.0,2.0l1.3,-1.3L4.3,3.0L3.0,4.3l2.9,2.9C5.3,8.2 5.0,9.3 5.0,10.5L5.0,16.0l-2.0,2.0l0.0,1.0L17.7,19.0z" />
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_qs_ringer_vibrate.xml
index 96d20e8..a23c6f0 100644
--- a/packages/SystemUI/res/drawable/ic_qs_ringer_vibrate.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_ringer_vibrate.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_rotation_landscape.xml b/packages/SystemUI/res/drawable/ic_qs_rotation_landscape.xml
index e4c7cb5..4bb3668 100644
--- a/packages/SystemUI/res/drawable/ic_qs_rotation_landscape.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_rotation_landscape.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M2.0,14.0l0.0,20.0c0.0,2.2 1.8,4.0 4.0,4.0l36.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L46.0,14.0c0.0,-2.2 -1.8,-4.0 -4.0,-4.0L6.0,10.0C3.8,10.0 2.0,11.8 2.0,14.0zM38.0,14.0l0.0,20.0L10.0,34.0L10.0,14.0L38.0,14.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_rotation_portrait.xml b/packages/SystemUI/res/drawable/ic_qs_rotation_portrait.xml
index e4bf367..f0878c7 100644
--- a/packages/SystemUI/res/drawable/ic_qs_rotation_portrait.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_rotation_portrait.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M34.0,2.0L14.0,2.0c-2.2,0.0 -4.0,1.8 -4.0,4.0l0.0,36.0c0.0,2.2 1.8,4.0 4.0,4.0l20.0,0.0c2.2,0.0 4.0,-1.8 4.0,-4.0L38.0,6.0C38.0,3.8 36.2,2.0 34.0,2.0zM34.0,38.0L14.0,38.0L14.0,10.0l20.0,0.0L34.0,38.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml b/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml
index a6c2cf8..6872a33 100644
--- a/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml
@@ -13,22 +13,19 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport
+        android:height="64dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M10.25,1.75c-0.6,-0.6 -1.5,-0.6 -2.1,0.0l-6.4,6.4c-0.6,0.6 -0.6,1.5 0.0,2.1l12.0,12.0c0.6,0.6 1.5,0.6 2.1,0.0l6.4,-6.4c0.6,-0.6 0.6,-1.5 0.0,-2.1L10.25,1.75zM14.85,21.25l-12.0,-12.0l6.4,-6.4l12.0,12.0L14.85,21.25z"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M16.55,2.5c3.3,1.5 5.6,4.7 6.0,8.5l1.5,0.0c-0.6,-6.2 -5.7,-11.0 -12.0,-11.0c-0.2,0.0 -0.4,0.0 -0.7,0.0l3.8,3.8L16.55,2.5z"/>
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M7.55,21.5c-3.3,-1.5 -5.6,-4.7 -6.0,-8.5l-1.4,0.0c0.5,6.2 5.6,11.0 11.9,11.0c0.2,0.0 0.4,0.0 0.7,0.0l-3.8,-3.8L7.55,21.5z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_detail_empty.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_detail_empty.xml
index 16fa30b..ad6b247 100644
--- a/packages/SystemUI/res/drawable/ic_qs_wifi_detail_empty.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_detail_empty.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="56dp"
-        android:height="56dp"/>
-
-    <viewport
+        android:height="56dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
         android:pathData="M24.0,4.0C15.0,4.0 6.7,7.0 0.0,12.0l24.0,32.0l24.0,-32.0C41.3,7.0 33.0,4.0 24.0,4.0z"
-        android:fill="@color/qs_detail_empty" />
+        android:fillColor="@color/qs_detail_empty" />
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_ringer_audible.xml b/packages/SystemUI/res/drawable/ic_ringer_audible.xml
index 2969948..f358fa2 100644
--- a/packages/SystemUI/res/drawable/ic_ringer_audible.xml
+++ b/packages/SystemUI/res/drawable/ic_ringer_audible.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M11.5,22.0c1.1,0.0 2.0,-0.9 2.0,-2.0l-4.0,0.0C9.5,21.1 10.4,22.0 11.5,22.0zM18.0,16.0l0.0,-5.5c0.0,-3.1 -2.1,-5.6 -5.0,-6.3L13.0,3.5C13.0,2.7 12.3,2.0 11.5,2.0C10.7,2.0 10.0,2.7 10.0,3.5l0.0,0.7c-2.9,0.7 -5.0,3.2 -5.0,6.3L5.0,16.0l-2.0,2.0l0.0,1.0l17.0,0.0l0.0,-1.0L18.0,16.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml b/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
index d8ded58..9642be3 100644
--- a/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
+++ b/packages/SystemUI/res/drawable/ic_ringer_vibrate.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="32dp"
-        android:height="32dp"/>
-
-    <viewport
+        android:height="32dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/ic_settings_24dp.xml b/packages/SystemUI/res/drawable/ic_settings_24dp.xml
index a2f7822..9c78742 100644
--- a/packages/SystemUI/res/drawable/ic_settings_24dp.xml
+++ b/packages/SystemUI/res/drawable/ic_settings_24dp.xml
@@ -12,18 +12,15 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-<size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
 android:width="24dp"
-android:height="24dp"/>
-
-    <viewport android:viewportWidth="24.0"
-          android:viewportHeight="24.0"/>
+android:height="24dp" android:viewportWidth="24.0"
+          android:viewportHeight="24.0">
 
 
 <path
      android:pathData="M19.4,13.0c0.0,-0.3 0.1,-0.6 0.1,-1.0s0.0,-0.7 -0.1,-1.0l2.1,-1.7c0.2,-0.2 0.2,-0.4 0.1,-0.6l-2.0,-3.5C19.5,5.1 19.3,5.0 19.0,5.1l-2.5,1.0c-0.5,-0.4 -1.1,-0.7 -1.7,-1.0l-0.4,-2.6C14.5,2.2 14.2,2.0 14.0,2.0l-4.0,0.0C9.8,2.0 9.5,2.2 9.5,2.4L9.1,5.1C8.5,5.3 8.0,5.7 7.4,6.1L5.0,5.1C4.7,5.0 4.5,5.1 4.3,5.3l-2.0,3.5C2.2,8.9 2.3,9.2 2.5,9.4L4.6,11.0c0.0,0.3 -0.1,0.6 -0.1,1.0s0.0,0.7 0.1,1.0l-2.1,1.7c-0.2,0.2 -0.2,0.4 -0.1,0.6l2.0,3.5C4.5,18.9 4.7,19.0 5.0,18.9l2.5,-1.0c0.5,0.4 1.1,0.7 1.7,1.0l0.4,2.6c0.0,0.2 0.2,0.4 0.5,0.4l4.0,0.0c0.2,0.0 0.5,-0.2 0.5,-0.4l0.4,-2.6c0.6,-0.3 1.2,-0.6 1.7,-1.0l2.5,1.0c0.2,0.1 0.5,0.0 0.6,-0.2l2.0,-3.5c0.1,-0.2 0.1,-0.5 -0.1,-0.6L19.4,13.0zM12.0,15.5c-1.9,0.0 -3.5,-1.6 -3.5,-3.5s1.6,-3.5 3.5,-3.5s3.5,1.6 3.5,3.5S13.9,15.5 12.0,15.5z"
-     android:fill="#ffffffff"
+     android:fillColor="#ffffffff"
      />
 
 </vector>
diff --git a/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml b/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml
index 9137e7f..71400db 100644
--- a/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml
+++ b/packages/SystemUI/res/drawable/qs_dual_tile_caret.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="@color/qs_tile_text"
+        android:fillColor="@color/qs_tile_text"
         android:pathData="M14.0,20.0l10.0,10.0 10.0,-10.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/qs_subhead_caret.xml b/packages/SystemUI/res/drawable/qs_subhead_caret.xml
index f140bd0..13a168d 100644
--- a/packages/SystemUI/res/drawable/qs_subhead_caret.xml
+++ b/packages/SystemUI/res/drawable/qs_subhead_caret.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="24.0dp"
-        android:height="24.0dp"/>
-
-    <viewport
+        android:height="24.0dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="@color/qs_subhead"
+        android:fillColor="@color/qs_subhead"
         android:pathData="M14.0,20.0l10.0,10.0 10.0,-10.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/recents_dismiss_dark.xml b/packages/SystemUI/res/drawable/recents_dismiss_dark.xml
index 9c1165d..337c028 100644
--- a/packages/SystemUI/res/drawable/recents_dismiss_dark.xml
+++ b/packages/SystemUI/res/drawable/recents_dismiss_dark.xml
@@ -13,20 +13,16 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="16dp"
-        android:width="16dp" />
-
-    <viewport
+        android:width="16dp"
         android:viewportHeight="100"
-        android:viewportWidth="100" />
+        android:viewportWidth="100" >
 
     <path
         android:name="x"
         android:pathData="M0,0L100,100M0,100L100,0z"
-        android:stroke="@color/recents_task_bar_dark_dismiss_color"
+        android:strokeColor="@color/recents_task_bar_dark_dismiss_color"
         android:strokeWidth="8.0"
         android:strokeLineCap="square" />
 
diff --git a/packages/SystemUI/res/drawable/recents_dismiss_light.xml b/packages/SystemUI/res/drawable/recents_dismiss_light.xml
index a8afeb3..963ccf7 100644
--- a/packages/SystemUI/res/drawable/recents_dismiss_light.xml
+++ b/packages/SystemUI/res/drawable/recents_dismiss_light.xml
@@ -13,21 +13,17 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="16dp"
-        android:width="16dp" />
-
-    <viewport
+        android:width="16dp"
         android:viewportHeight="100"
-        android:viewportWidth="100" />
+        android:viewportWidth="100" >
 
 
     <path
         android:name="x"
         android:pathData="M0,0L100,100M0,100L100,0z"
-        android:stroke="@color/recents_task_bar_light_dismiss_color"
+        android:strokeColor="@color/recents_task_bar_light_dismiss_color"
         android:strokeWidth="8.0"
         android:strokeLineCap="square" />
 
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_bluetooth.xml b/packages/SystemUI/res/drawable/stat_sys_data_bluetooth.xml
index e28490b..f53f0e4 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_bluetooth.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_bluetooth.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="18dp"
-        android:height="18dp"/>
-
-    <viewport
+        android:height="18dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_bluetooth_connected.xml b/packages/SystemUI/res/drawable/stat_sys_data_bluetooth_connected.xml
index c012d14..2aac4ee 100644
--- a/packages/SystemUI/res/drawable/stat_sys_data_bluetooth_connected.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_data_bluetooth_connected.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="18dp"
-        android:height="18dp"/>
-
-    <viewport
+        android:height="18dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M14.0,24.0l-4.0,-4.0l-4.0,4.0l4.0,4.0L14.0,24.0zM35.4,15.4L24.0,4.0l-2.0,0.0l0.0,15.2L12.8,10.0L10.0,12.8L21.2,24.0L10.0,35.2l2.8,2.8l9.2,-9.2L22.0,44.0l2.0,0.0l11.4,-11.4L26.8,24.0L35.4,15.4zM26.0,11.7l3.8,3.8L26.0,19.2L26.0,11.7zM29.8,32.6L26.0,36.3l0.0,-7.5L29.8,32.6zM38.0,20.0l-4.0,4.0l4.0,4.0l4.0,-4.0L38.0,20.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_no_sim.xml b/packages/SystemUI/res/drawable/stat_sys_no_sim.xml
index 70948b7..22d1d4b 100644
--- a/packages/SystemUI/res/drawable/stat_sys_no_sim.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_no_sim.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="18dp"
-        android:height="18dp"/>
-
-    <viewport
+        android:height="18dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#4DFFFFFF"
+        android:fillColor="#4DFFFFFF"
         android:pathData="M19.0,5.0c0.0,-1.1 -0.9,-2.0 -2.0,-2.0l-7.0,0.0L7.7,5.3L19.0,16.7L19.0,5.0zM3.7,3.9L2.4,5.2L5.0,7.8L5.0,19.0c0.0,1.1 0.9,2.0 2.0,2.0l10.0,0.0c0.4,0.0 0.7,-0.1 1.0,-0.3l1.9,1.9l1.3,-1.3L3.7,3.9z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_ringer_vibrate.xml b/packages/SystemUI/res/drawable/stat_sys_ringer_vibrate.xml
index e1d63c3..352d86f 100644
--- a/packages/SystemUI/res/drawable/stat_sys_ringer_vibrate.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_ringer_vibrate.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="20dp"
-        android:height="20dp"/>
-
-    <viewport
+        android:height="20dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M0.0,15.0l2.0,0.0L2.0,9.0L0.0,9.0L0.0,15.0zM3.0,17.0l2.0,0.0L5.0,7.0L3.0,7.0L3.0,17.0zM22.0,9.0l0.0,6.0l2.0,0.0L24.0,9.0L22.0,9.0zM19.0,17.0l2.0,0.0L21.0,7.0l-2.0,0.0L19.0,17.0zM16.5,3.0l-9.0,0.0C6.7,3.0 6.0,3.7 6.0,4.5l0.0,15.0C6.0,20.3 6.7,21.0 7.5,21.0l9.0,0.0c0.8,0.0 1.5,-0.7 1.5,-1.5l0.0,-15.0C18.0,3.7 17.3,3.0 16.5,3.0zM16.0,19.0L8.0,19.0L8.0,5.0l8.0,0.0L16.0,19.0z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_zen_important.xml b/packages/SystemUI/res/drawable/stat_sys_zen_important.xml
index 54a9b1b..73d7cba 100644
--- a/packages/SystemUI/res/drawable/stat_sys_zen_important.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_zen_important.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="20dp"
-        android:height="20dp"/>
-
-    <viewport
+        android:height="20dp"
         android:viewportWidth="24.0"
-        android:viewportHeight="24.0"/>
+        android:viewportHeight="24.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M12.0,17.273l6.1800003,3.7269993 -1.6350002,-7.0290003 5.455,-4.7269993 -7.191,-0.6170006 -2.809,-6.627 -2.809,6.627 -7.191,0.6170006 5.455,4.7269993 -1.6349998,7.0290003z"/>
 </vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_zen_none.xml b/packages/SystemUI/res/drawable/stat_sys_zen_none.xml
index 101e3c4..d8ab078 100644
--- a/packages/SystemUI/res/drawable/stat_sys_zen_none.xml
+++ b/packages/SystemUI/res/drawable/stat_sys_zen_none.xml
@@ -13,16 +13,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="19dp"
-        android:height="19dp"/>
-
-    <viewport
+        android:height="19dp"
         android:viewportWidth="48.0"
-        android:viewportHeight="48.0"/>
+        android:viewportHeight="48.0">
 
     <path
-        android:fill="#FFFFFFFF"
+        android:fillColor="#FFFFFFFF"
         android:pathData="M24.0,4.0C13.0,4.0 4.0,13.0 4.0,24.0c0.0,11.0 9.0,20.0 20.0,20.0c11.0,0.0 20.0,-9.0 20.0,-20.0C44.0,13.0 35.0,4.0 24.0,4.0zM24.0,40.0c-8.8,0.0 -16.0,-7.2 -16.0,-16.0c0.0,-3.7 1.3,-7.1 3.4,-9.8l22.4,22.4C31.1,38.7 27.7,40.0 24.0,40.0zM36.6,33.8L14.2,11.4C16.9,9.3 20.3,8.0 24.0,8.0c8.8,0.0 16.0,7.2 16.0,16.0C40.0,27.7 38.7,31.1 36.6,33.8z"/>
 </vector>
diff --git a/packages/SystemUI/res/layout/keyguard_bottom_area.xml b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
index 42fb740..f831570 100644
--- a/packages/SystemUI/res/layout/keyguard_bottom_area.xml
+++ b/packages/SystemUI/res/layout/keyguard_bottom_area.xml
@@ -22,6 +22,23 @@
     android:layout_height="match_parent"
     android:layout_width="match_parent"
     >
+
+    <com.android.systemui.statusbar.phone.KeyguardIndicationTextView
+        android:id="@+id/keyguard_indication_text"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="70dp"
+        android:layout_gravity="bottom|center_horizontal"
+        android:textStyle="italic"
+        android:textColor="#ffffff"
+        android:textAppearance="?android:attr/textAppearanceSmall"/>
+
+    <FrameLayout
+        android:id="@+id/preview_container"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+    </FrameLayout>
+
     <com.android.systemui.statusbar.KeyguardAffordanceView
         android:id="@+id/camera_button"
         android:layout_height="64dp"
@@ -42,16 +59,6 @@
         android:scaleType="center"
         android:contentDescription="@string/accessibility_phone_button" />
 
-    <com.android.systemui.statusbar.phone.KeyguardIndicationTextView
-        android:id="@+id/keyguard_indication_text"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginBottom="70dp"
-        android:layout_gravity="bottom|center_horizontal"
-        android:textStyle="italic"
-        android:textColor="#ffffff"
-        android:textAppearance="?android:attr/textAppearanceSmall"/>
-
     <com.android.systemui.statusbar.KeyguardAffordanceView
         android:id="@+id/lock_icon"
         android:layout_width="64dp"
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 595d731..19dc36d 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -87,7 +87,8 @@
                 android:layout_height="match_parent"
                 android:gravity="center_vertical"
                 >
-                <LinearLayout android:id="@+id/statusIcons"
+                <com.android.systemui.statusbar.AlphaOptimizedLinearLayout
+                    android:id="@+id/statusIcons"
                     android:layout_width="wrap_content"
                     android:layout_height="match_parent"
                     android:gravity="center_vertical"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
index 272904a..0eec094 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
@@ -68,7 +68,7 @@
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center_vertical"
-            android:layout_marginStart="8dp"
+            android:layout_marginStart="@dimen/header_battery_margin_keyguard"
             android:paddingEnd="@dimen/battery_level_padding_end"
             android:textColor="#ffffff"
             android:textSize="12sp"/>
@@ -87,24 +87,15 @@
         android:text="@*android:string/emergency_calls_only"
         android:gravity="center_vertical" />
 
-    <RelativeLayout
-        android:id="@+id/datetime"
+    <FrameLayout
+        android:id="@+id/date_group"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_gravity="start"
-        android:paddingTop="4dp"
-        android:paddingStart="16dp"
-        android:paddingEnd="16dp"
-        android:background="?android:attr/selectableItemBackground"
-        android:enabled="false"
-        >
-        <include layout="@layout/split_clock_view"
-            android:id="@+id/clock"
-            />
-
+        android:layout_alignParentBottom="true">
         <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_collapsed"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginStart="16dp"
             android:singleLine="true"
             android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
             android:layout_below="@id/clock"
@@ -113,17 +104,45 @@
         <com.android.systemui.statusbar.policy.DateView android:id="@+id/date_expanded"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
+            android:layout_marginStart="16dp"
             android:singleLine="true"
             android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
             android:layout_below="@id/clock"
             systemui:datePattern="eeeeMMMMd"
             />
-    </RelativeLayout>
+    </FrameLayout>
+
+    <include layout="@layout/split_clock_view"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginStart="16dp"
+        android:layout_above="@id/date_group"
+        android:id="@+id/clock"
+        />
+
+    <Button android:id="@+id/alarm_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_toEndOf="@id/date_group"
+        android:layout_marginBottom="4dp"
+        android:drawablePadding="6dp"
+        android:drawableStart="@drawable/ic_access_alarms_small"
+        android:textColor="#64ffffff"
+        android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
+        android:paddingEnd="6dp"
+        android:paddingStart="6dp"
+        android:paddingTop="16dp"
+        android:paddingBottom="16dp"
+        android:background="?android:attr/selectableItemBackground"
+        android:visibility="gone"
+        />
+
     <com.android.keyguard.CarrierText
         android:id="@+id/keyguard_carrier_text"
         android:layout_width="match_parent"
         android:layout_height="@dimen/status_bar_header_height_keyguard"
-        android:layout_marginLeft="16dp"
+        android:layout_marginStart="@dimen/keyguard_carrier_text_margin"
         android:layout_toStartOf="@id/system_icons_super_container"
         android:gravity="center_vertical"
         android:ellipsize="marquee"
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index a5e3924..953a3ab 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -62,4 +62,22 @@
          keyguard_clock_height_fraction_* for the difference between min and max.-->
     <dimen name="keyguard_clock_notifications_margin_min">44dp</dimen>
     <dimen name="keyguard_clock_notifications_margin_max">44dp</dimen>
+
+    <!-- Height of the status bar header bar when on Keyguard -->
+    <dimen name="status_bar_header_height_keyguard">60dp</dimen>
+
+    <!-- The width of user avatar when on Keyguard -->
+    <dimen name="multi_user_switch_width_keyguard">48dp</dimen>
+
+    <!-- The width of user avatar when on Keyguard -->
+    <dimen name="multi_user_avatar_keyguard_size">30dp</dimen>
+
+    <!-- end margin for multi user switch in collapsed quick settings -->
+    <dimen name="multi_user_switch_keyguard_margin">6dp</dimen>
+
+    <!-- Margin on the left side of the carrier text on Keyguard -->
+    <dimen name="keyguard_carrier_text_margin">24dp</dimen>
+
+    <!-- end margin for system icons if multi user switch is hidden -->
+    <dimen name="system_icons_switcher_hidden_expanded_margin">20dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index fbd3eb5..bd10623 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -353,15 +353,24 @@
     <!-- The padding bottom of the clock group when QS is expanded. -->
     <dimen name="clock_expanded_bottom_margin">20dp</dimen>
 
+    <!-- The padding bottom of the clock group when QS is collapsed. -->
+    <dimen name="clock_collapsed_bottom_margin">10dp</dimen>
+
     <!-- The width of the multi user switch on keyguard and collapsed QS header. -->
     <dimen name="multi_user_switch_width_collapsed">34dp</dimen>
 
     <!-- The width of the multi user switch in expanded QS header. -->
     <dimen name="multi_user_switch_width_expanded">48dp</dimen>
 
+    <!-- The width of user avatar when on Keyguard -->
+    <dimen name="multi_user_switch_width_keyguard">34dp</dimen>
+
     <!-- The width of user avatar when collapsed -->
     <dimen name="multi_user_avatar_collapsed_size">22dp</dimen>
 
+    <!-- The width of user avatar when on Keyguard -->
+    <dimen name="multi_user_avatar_keyguard_size">22dp</dimen>
+
     <!-- The font size of the time when collapsed in QS -->
     <dimen name="qs_time_collapsed_size">14sp</dimen>
 
@@ -377,4 +386,13 @@
     <!-- Largest size an avatar might need to be drawn in the user picker, status bar, or
          quick settings header -->
     <dimen name="max_avatar_size">48dp</dimen>
+
+    <!-- Margin on the left side of the carrier text on Keyguard -->
+    <dimen name="keyguard_carrier_text_margin">16dp</dimen>
+
+    <!-- Margin on the left side of the battery % in the header. -->
+    <dimen name="header_battery_margin_expanded">8dp</dimen>
+
+    <!-- Margin on the left side of the battery % when on Keyguard. -->
+    <dimen name="header_battery_margin_keyguard">6dp</dimen>
 </resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index ddbddd1..085d2f9 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -741,4 +741,7 @@
 
     <!-- Media projection permission dialog action text. [CHAR LIMIT=60] -->
     <string name="media_projection_action_text">Start now</string>
+
+    <!-- Text which is shown in the notification shade when there are no notifications. [CHAR LIMIT=30] -->
+    <string name="empty_shade_text">No notifications</string>
 </resources>
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 5e48258..b9ffdbb 100755
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -402,6 +402,11 @@
         }
     }
 
+    @Override
+    public boolean hasOverlappingRendering() {
+        return false;
+    }
+
     private boolean mDemoMode;
     private BatteryTracker mDemoTracker = new BatteryTracker();
 
diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
index bbda536..a26c534 100644
--- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
@@ -29,11 +29,13 @@
 import android.view.MotionEvent;
 import android.view.ScaleGestureDetector;
 import android.view.ScaleGestureDetector.OnScaleGestureListener;
+import android.view.VelocityTracker;
 import android.view.View;
 import android.view.ViewConfiguration;
 
 import com.android.systemui.statusbar.ExpandableNotificationRow;
 import com.android.systemui.statusbar.ExpandableView;
+import com.android.systemui.statusbar.FlingAnimationUtils;
 import com.android.systemui.statusbar.policy.ScrollAdapter;
 
 public class ExpandHelper implements Gefingerpoken {
@@ -49,7 +51,7 @@
     private static final String TAG = "ExpandHelper";
     protected static final boolean DEBUG = false;
     protected static final boolean DEBUG_SCALE = false;
-    private static final long EXPAND_DURATION = 250;
+    private static final float EXPAND_DURATION = 0.3f;
 
     // Set to false to disable focus-based gestures (spread-finger vertical pull).
     private static final boolean USE_DRAG = true;
@@ -112,6 +114,8 @@
     private int mGravity;
 
     private ScrollAdapter mScrollAdapter;
+    private FlingAnimationUtils mFlingAnimationUtils;
+    private VelocityTracker mVelocityTracker;
 
     private OnScaleGestureListener mScaleGestureListener
             = new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@@ -171,7 +175,6 @@
         mScaler = new ViewScaler();
         mGravity = Gravity.TOP;
         mScaleAnimation = ObjectAnimator.ofFloat(mScaler, "height", 0f);
-        mScaleAnimation.setDuration(EXPAND_DURATION);
         mPopDuration = mContext.getResources().getInteger(R.integer.blinds_pop_duration_ms);
         mPullGestureMinXSpan = mContext.getResources().getDimension(R.dimen.pull_span_min);
 
@@ -179,6 +182,7 @@
         mTouchSlop = configuration.getScaledTouchSlop();
 
         mSGD = new ScaleGestureDetector(context, mScaleGestureListener);
+        mFlingAnimationUtils = new FlingAnimationUtils(context, EXPAND_DURATION);
     }
 
     private void updateExpansion() {
@@ -260,6 +264,7 @@
         if (!isEnabled()) {
             return false;
         }
+        trackVelocity(ev);
         final int action = ev.getAction();
         if (DEBUG_SCALE) Log.d(TAG, "intercept: act=" + MotionEvent.actionToString(action) +
                          " expanding=" + mExpanding +
@@ -279,6 +284,7 @@
 
         if (mExpanding) {
             mLastMotionY = ev.getRawY();
+            maybeRecycleVelocityTracker(ev);
             return true;
         } else {
             if ((action == MotionEvent.ACTION_MOVE) && 0 != (mExpansionStyle & BLINDS)) {
@@ -323,15 +329,52 @@
             case MotionEvent.ACTION_CANCEL:
             case MotionEvent.ACTION_UP:
                 if (DEBUG) Log.d(TAG, "up/cancel");
-                finishExpanding(false);
+                finishExpanding(false, getCurrentVelocity());
                 clearView();
                 break;
             }
             mLastMotionY = ev.getRawY();
+            maybeRecycleVelocityTracker(ev);
             return mExpanding;
         }
     }
 
+    private void trackVelocity(MotionEvent event) {
+        int action = event.getActionMasked();
+        switch(action) {
+            case MotionEvent.ACTION_DOWN:
+                if (mVelocityTracker == null) {
+                    mVelocityTracker = VelocityTracker.obtain();
+                } else {
+                    mVelocityTracker.clear();
+                }
+                mVelocityTracker.addMovement(event);
+                break;
+            case MotionEvent.ACTION_MOVE:
+                mVelocityTracker.addMovement(event);
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void maybeRecycleVelocityTracker(MotionEvent event) {
+        if (event.getActionMasked() == MotionEvent.ACTION_CANCEL
+                || event.getActionMasked() == MotionEvent.ACTION_UP) {
+            mVelocityTracker.recycle();
+            mVelocityTracker = null;
+        }
+    }
+
+    private float getCurrentVelocity() {
+        if (mVelocityTracker != null) {
+            mVelocityTracker.computeCurrentVelocity(1000);
+            return mVelocityTracker.getYVelocity();
+        } else {
+            return 0f;
+        }
+    }
+
     public void setEnabled(boolean enable) {
         mEnabled = enable;
     }
@@ -349,6 +392,7 @@
         if (!isEnabled()) {
             return false;
         }
+        trackVelocity(ev);
         final int action = ev.getActionMasked();
         if (DEBUG_SCALE) Log.d(TAG, "touch: act=" + MotionEvent.actionToString(action) +
                 " expanding=" + mExpanding +
@@ -438,11 +482,12 @@
             case MotionEvent.ACTION_UP:
             case MotionEvent.ACTION_CANCEL:
                 if (DEBUG) Log.d(TAG, "up/cancel");
-                finishExpanding(false);
+                finishExpanding(false, getCurrentVelocity());
                 clearView();
                 break;
         }
         mLastMotionY = ev.getRawY();
+        maybeRecycleVelocityTracker(ev);
         return mResizedView != null;
     }
 
@@ -476,7 +521,7 @@
         return true;
     }
 
-    private void finishExpanding(boolean force) {
+    private void finishExpanding(boolean force, float velocity) {
         if (!mExpanding) return;
 
         if (DEBUG) Log.d(TAG, "scale in finishing on view: " + mResizedView);
@@ -506,6 +551,7 @@
                     mScaleAnimation.removeListener(this);
                 }
             });
+            mFlingAnimationUtils.apply(mScaleAnimation, currentHeight, targetHeight, velocity);
             mScaleAnimation.start();
         } else {
             mCallback.setUserLockedChild(mResizedView, false);
@@ -529,7 +575,7 @@
      * Use this to abort any pending expansions in progress.
      */
     public void cancel() {
-        finishExpanding(true);
+        finishExpanding(true, 0f /* velocity */);
         clearView();
 
         // reset the gesture detector
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index 333b8b4..13c15f5 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -32,7 +32,6 @@
 import android.os.PowerManager;
 import android.os.SystemProperties;
 import android.os.Vibrator;
-import android.service.dreams.DozeHardware;
 import android.service.dreams.DreamService;
 import android.util.Log;
 import android.util.MathUtils;
@@ -55,7 +54,6 @@
     private final Handler mHandler = new Handler();
 
     private Host mHost;
-    private DozeHardware mDozeHardware;
     private SensorManager mSensors;
     private Sensor mSigMotionSensor;
     private PowerManager mPowerManager;
@@ -77,7 +75,6 @@
     protected void dumpOnHandler(FileDescriptor fd, PrintWriter pw, String[] args) {
         super.dumpOnHandler(fd, pw, args);
         pw.print("  mDreaming: "); pw.println(mDreaming);
-        pw.print("  mDozeHardware: "); pw.println(mDozeHardware);
         pw.print("  mTeaseReceiverRegistered: "); pw.println(mTeaseReceiverRegistered);
         pw.print("  mSigMotionSensor: "); pw.println(mSigMotionSensor);
         pw.print("  mSigMotionConfigured: "); pw.println(mSigMotionConfigured);
@@ -123,9 +120,7 @@
     @Override
     public void onDreamingStarted() {
         super.onDreamingStarted();
-        mDozeHardware = getDozeHardware();
-        if (DEBUG) Log.d(mTag, "onDreamingStarted canDoze=" + canDoze()
-                + " dozeHardware=" + mDozeHardware);
+        if (DEBUG) Log.d(mTag, "onDreamingStarted canDoze=" + canDoze());
         mDreaming = true;
         listenForTeaseSignals(true);
         requestDoze();
@@ -162,7 +157,6 @@
         super.onDreamingStopped();
 
         mDreaming = false;
-        mDozeHardware = null;
         if (mWakeLock.isHeld()) {
             mWakeLock.release();
         }
@@ -292,6 +286,11 @@
         @Override
         public void onNewNotifications() {
             if (DEBUG) Log.d(mTag, "onNewNotifications");
+            // noop for now
+        }
+        @Override
+        public void onBuzzBeepBlinked() {
+            if (DEBUG) Log.d(mTag, "onBuzzBeepBlinked");
             requestTease();
         }
     };
@@ -305,6 +304,7 @@
 
         public interface Callback {
             void onNewNotifications();
+            void onBuzzBeepBlinked();
         }
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index d76a2fe..42da282 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -93,10 +93,10 @@
         final Resources r = mContext.getResources();
         state.iconId = cb.noSim
                 ? R.drawable.stat_sys_no_sim
-                : cb.enabled && (cb.mobileSignalIconId > 0)
+                : cb.enabled && (cb.mobileSignalIconId > 0) && !cb.airplaneModeEnabled
                 ? cb.mobileSignalIconId
                 : R.drawable.ic_qs_signal_no_signal;
-        state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiEnabled
+        state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiConnected
                 ? cb.dataTypeIconId
                 : 0;
         state.filter = state.iconId != R.drawable.stat_sys_no_sim;
@@ -132,6 +132,8 @@
     private static final class CallbackInfo {
         boolean enabled;
         boolean wifiEnabled;
+        boolean wifiConnected;
+        boolean airplaneModeEnabled;
         int mobileSignalIconId;
         String signalContentDescription;
         int dataTypeIconId;
@@ -144,12 +146,15 @@
 
     private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() {
         private boolean mWifiEnabled;
+        private boolean mWifiConnected;
+        private boolean mAirplaneModeEnabled;
 
         @Override
-        public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId,
+        public void onWifiSignalChanged(boolean enabled, boolean connected, int wifiSignalIconId,
                 boolean activityIn, boolean activityOut,
                 String wifiSignalContentDescriptionId, String description) {
             mWifiEnabled = enabled;
+            mWifiConnected = connected;
         }
 
         @Override
@@ -161,6 +166,8 @@
             final CallbackInfo info = new CallbackInfo();  // TODO pool?
             info.enabled = enabled;
             info.wifiEnabled = mWifiEnabled;
+            info.wifiConnected = mWifiConnected;
+            info.airplaneModeEnabled = mAirplaneModeEnabled;
             info.mobileSignalIconId = mobileSignalIconId;
             info.signalContentDescription = mobileSignalContentDescriptionId;
             info.dataTypeIconId = dataTypeIconId;
@@ -174,7 +181,7 @@
 
         @Override
         public void onAirplaneModeChanged(boolean enabled) {
-            // noop
+            mAirplaneModeEnabled = enabled;
         }
 
         public void onMobileDataEnabled(boolean enabled) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
index 35dfdda..e0b465e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/HotspotTile.java
@@ -24,7 +24,6 @@
 import com.android.systemui.R;
 import com.android.systemui.qs.QSTile;
 import com.android.systemui.statusbar.policy.HotspotController;
-import com.android.systemui.statusbar.policy.KeyguardMonitor;
 
 /** Quick settings tile: Hotspot **/
 public class HotspotTile extends QSTile<QSTile.BooleanState> {
@@ -32,14 +31,12 @@
     private static final long MILLIS_PER_DAY = 1000 * 60 * 60 * 24;
 
     private final HotspotController mController;
-    private final KeyguardMonitor mKeyguard;
     private final Callback mCallback = new Callback();
     private final long mTimeToShowTile;
 
     public HotspotTile(Host host) {
         super(host);
         mController = host.getHotspotController();
-        mKeyguard = host.getKeyguardMonitor();
 
         mTimeToShowTile = MILLIS_PER_DAY
                 * mContext.getResources().getInteger(R.integer.days_to_show_hotspot);
@@ -54,10 +51,8 @@
     public void setListening(boolean listening) {
         if (listening) {
             mController.addCallback(mCallback);
-            mKeyguard.addCallback(mCallback);
         } else {
             mController.removeCallback(mCallback);
-            mKeyguard.removeCallback(mCallback);
         }
     }
 
@@ -69,8 +64,7 @@
 
     @Override
     protected void handleUpdateState(BooleanState state, Object arg) {
-        state.visible = !(mKeyguard.isSecure() && mKeyguard.isShowing())
-                && mController.isHotspotSupported() && isHotspotRecentlyUsed();
+        state.visible = mController.isHotspotSupported() && isHotspotRecentlyUsed();
         state.label = mContext.getString(R.string.quick_settings_hotspot_label);
 
         state.value = mController.isHotspotEnabled();
@@ -87,16 +81,11 @@
         return context.getSharedPreferences(context.getPackageName(), 0);
     }
 
-    private final class Callback implements HotspotController.Callback, KeyguardMonitor.Callback {
+    private final class Callback implements HotspotController.Callback {
         @Override
         public void onHotspotChanged(boolean enabled) {
             refreshState();
         }
-
-        @Override
-        public void onKeyguardChanged() {
-            refreshState();
-        }
     };
 
     /**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 900c7b26..1707b32 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -143,6 +143,7 @@
 
     private static final class CallbackInfo {
         boolean enabled;
+        boolean connected;
         int wifiSignalIconId;
         String enabledDesc;
         boolean activityIn;
@@ -153,6 +154,7 @@
         public String toString() {
             return new StringBuilder("CallbackInfo[")
                 .append("enabled=").append(enabled)
+                .append(",connected=").append(connected)
                 .append(",wifiSignalIconId=").append(wifiSignalIconId)
                 .append(",enabledDesc=").append(enabledDesc)
                 .append(",activityIn=").append(activityIn)
@@ -164,12 +166,13 @@
 
     private final NetworkSignalChangedCallback mCallback = new NetworkSignalChangedCallback() {
         @Override
-        public void onWifiSignalChanged(boolean enabled, int wifiSignalIconId,
+        public void onWifiSignalChanged(boolean enabled, boolean connected, int wifiSignalIconId,
                 boolean activityIn, boolean activityOut,
                 String wifiSignalContentDescriptionId, String description) {
             if (DEBUG) Log.d(TAG, "onWifiSignalChanged enabled=" + enabled);
             final CallbackInfo info = new CallbackInfo();
             info.enabled = enabled;
+            info.connected = connected;
             info.wifiSignalIconId = wifiSignalIconId;
             info.enabledDesc = description;
             info.activityIn = activityIn;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index eb44002..a82c907 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -54,6 +54,7 @@
     private static final int MSG_SET_WINDOW_STATE           = 13 << MSG_SHIFT;
     private static final int MSG_SHOW_RECENT_APPS           = 14 << MSG_SHIFT;
     private static final int MSG_HIDE_RECENT_APPS           = 15 << MSG_SHIFT;
+    private static final int MSG_BUZZ_BEEP_BLINKED          = 16 << MSG_SHIFT;
 
     public static final int FLAG_EXCLUDE_NONE = 0;
     public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -93,6 +94,7 @@
         public void showSearchPanel();
         public void hideSearchPanel();
         public void setWindowState(int window, int state);
+        public void buzzBeepBlinked();
     }
 
     public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -221,6 +223,12 @@
         }
     }
 
+    public void buzzBeepBlinked() {
+        synchronized (mList) {
+            mHandler.removeMessages(MSG_BUZZ_BEEP_BLINKED);
+            mHandler.sendEmptyMessage(MSG_BUZZ_BEEP_BLINKED);
+        }
+    }
 
     private final class H extends Handler {
         public void handleMessage(Message msg) {
@@ -295,6 +303,9 @@
                 case MSG_SET_WINDOW_STATE:
                     mCallbacks.setWindowState(msg.arg1, msg.arg2);
                     break;
+                case MSG_BUZZ_BEEP_BLINKED:
+                    mCallbacks.buzzBeepBlinked();
+                    break;
 
             }
         }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index 517a4e8..e9989ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -19,6 +19,7 @@
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
 import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
 import android.content.Context;
 import android.view.MotionEvent;
 import android.view.View;
@@ -46,22 +47,23 @@
     private float mInitialTouchY;
     private boolean mDraggingDown;
     private float mTouchSlop;
-    private OnDragDownListener mOnDragDownListener;
+    private DragDownCallback mDragDownCallback;
     private View mHost;
     private final int[] mTemp2 = new int[2];
     private boolean mDraggedFarEnough;
     private ExpandableView mStartingChild;
     private Interpolator mInterpolator;
+    private float mLastHeight;
 
     public DragDownHelper(Context context, View host, ExpandHelper.Callback callback,
-            OnDragDownListener onDragDownListener) {
+            DragDownCallback dragDownCallback) {
         mMinDragDistance = context.getResources().getDimensionPixelSize(
                 R.dimen.keyguard_drag_down_min_distance);
         mInterpolator =
                 AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in);
         mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
         mCallback = callback;
-        mOnDragDownListener = onDragDownListener;
+        mDragDownCallback = dragDownCallback;
         mHost = host;
     }
 
@@ -86,7 +88,7 @@
                     captureStartingChild(mInitialTouchX, mInitialTouchY);
                     mInitialTouchY = y;
                     mInitialTouchX = x;
-                    mOnDragDownListener.onTouchSlopExceeded();
+                    mDragDownCallback.onTouchSlopExceeded();
                     return true;
                 }
                 break;
@@ -104,29 +106,32 @@
 
         switch (event.getActionMasked()) {
             case MotionEvent.ACTION_MOVE:
-                final float h = y - mInitialTouchY;
+                mLastHeight = y - mInitialTouchY;
                 captureStartingChild(mInitialTouchX, mInitialTouchY);
                 if (mStartingChild != null) {
-                    handleExpansion(h, mStartingChild);
+                    handleExpansion(mLastHeight, mStartingChild);
+                } else {
+                    mDragDownCallback.setEmptyDragAmount(mLastHeight);
                 }
-                if (h > mMinDragDistance) {
+                if (mLastHeight > mMinDragDistance) {
                     if (!mDraggedFarEnough) {
                         mDraggedFarEnough = true;
-                        mOnDragDownListener.onThresholdReached();
+                        mDragDownCallback.onThresholdReached();
                     }
                 } else {
                     if (mDraggedFarEnough) {
                         mDraggedFarEnough = false;
-                        mOnDragDownListener.onDragDownReset();
+                        mDragDownCallback.onDragDownReset();
                     }
                 }
                 return true;
             case MotionEvent.ACTION_UP:
-                if (mDraggedFarEnough) {
+                if (mDraggedFarEnough && mDragDownCallback.onDraggedDown(mStartingChild)) {
                     if (mStartingChild != null) {
                         mCallback.setUserLockedChild(mStartingChild, false);
+                    } else {
+                        mDragDownCallback.setEmptyDragAmount(0f);
                     }
-                    mOnDragDownListener.onDraggedDown(mStartingChild);
                     mDraggingDown = false;
                 } else {
                     stopDragging();
@@ -183,12 +188,27 @@
         anim.start();
     }
 
+    private void cancelExpansion() {
+        ValueAnimator anim = ValueAnimator.ofFloat(mLastHeight, 0);
+        anim.setInterpolator(mInterpolator);
+        anim.setDuration(SPRING_BACK_ANIMATION_LENGTH_MS);
+        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+            @Override
+            public void onAnimationUpdate(ValueAnimator animation) {
+                mDragDownCallback.setEmptyDragAmount((Float) animation.getAnimatedValue());
+            }
+        });
+        anim.start();
+    }
+
     private void stopDragging() {
         if (mStartingChild != null) {
             cancelExpansion(mStartingChild);
+        } else {
+            cancelExpansion();
         }
         mDraggingDown = false;
-        mOnDragDownListener.onDragDownReset();
+        mDragDownCallback.onDragDownReset();
     }
 
     private ExpandableView findView(float x, float y) {
@@ -198,10 +218,15 @@
         return mCallback.getChildAtRawPosition(x, y);
     }
 
-    public interface OnDragDownListener {
-        void onDraggedDown(View startingChild);
+    public interface DragDownCallback {
+
+        /**
+         * @return true if the interaction is accepted, false if it should be cancelled
+         */
+        boolean onDraggedDown(View startingChild);
         void onDragDownReset();
         void onThresholdReached();
         void onTouchSlopExceeded();
+        void setEmptyDragAmount(float amount);
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java b/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java
index 9968bbc..9f0f84e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/FlingAnimationUtils.java
@@ -16,6 +16,7 @@
 
 package com.android.systemui.statusbar;
 
+import android.animation.Animator;
 import android.animation.ValueAnimator;
 import android.content.Context;
 import android.view.ViewPropertyAnimator;
@@ -72,7 +73,7 @@
      * @param endValue the end value of the animator
      * @param velocity the current velocity of the motion
      */
-    public void apply(ValueAnimator animator, float currValue, float endValue, float velocity) {
+    public void apply(Animator animator, float currValue, float endValue, float velocity) {
         apply(animator, currValue, endValue, velocity, Math.abs(endValue - currValue));
     }
 
@@ -101,7 +102,7 @@
      * @param maxDistance the maximum distance for this interaction; the maximum animation length
      *                    gets multiplied by the ratio between the actual distance and this value
      */
-    public void apply(ValueAnimator animator, float currValue, float endValue, float velocity,
+    public void apply(Animator animator, float currValue, float endValue, float velocity,
             float maxDistance) {
         AnimatorProperties properties = getProperties(currValue, endValue, velocity,
                 maxDistance);
@@ -168,7 +169,7 @@
      * @param maxDistance the maximum distance for this interaction; the maximum animation length
      *                    gets multiplied by the ratio between the actual distance and this value
      */
-    public void applyDismissing(ValueAnimator animator, float currValue, float endValue,
+    public void applyDismissing(Animator animator, float currValue, float endValue,
             float velocity, float maxDistance) {
         AnimatorProperties properties = getDismissingProperties(currValue, endValue, velocity,
                 maxDistance);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
index 845e0ae..19bf121 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java
@@ -28,6 +28,8 @@
 import android.graphics.PorterDuff;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.view.View;
+import android.view.ViewAnimationUtils;
 import android.view.animation.AnimationUtils;
 import android.view.animation.Interpolator;
 import android.widget.ImageView;
@@ -69,6 +71,16 @@
     private int mCircleColor;
     private boolean mIsLeft;
     private float mArrowAlpha = 0.0f;
+    private View mPreviewView;
+    private float mCircleStartRadius;
+    private float mMaxCircleSize;
+    private Animator mPreviewClipper;
+    private AnimatorListenerAdapter mClipEndListener = new AnimatorListenerAdapter() {
+        @Override
+        public void onAnimationEnd(Animator animation) {
+            mPreviewClipper = null;
+        }
+    };
     private AnimatorListenerAdapter mCircleEndListener = new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
@@ -136,6 +148,7 @@
         super.onLayout(changed, left, top, right, bottom);
         mCenterX = getWidth() / 2;
         mCenterY = getHeight() / 2;
+        mMaxCircleSize = getMaxCircleSize();
     }
 
     @Override
@@ -149,6 +162,10 @@
         canvas.restore();
     }
 
+    public void setPreviewView(View v) {
+        mPreviewView = v;
+    }
+
     private void drawArrow(Canvas canvas) {
         if (mArrowAlpha > 0) {
             canvas.save();
@@ -183,6 +200,11 @@
     private void updateCircleColor() {
         float fraction = 0.5f + 0.5f * Math.max(0.0f, Math.min(1.0f,
                 (mCircleRadius - mMinBackgroundRadius) / (0.5f * mMinBackgroundRadius)));
+        if (mPreviewView != null) {
+            float finishingFraction = 1 - Math.max(0, mCircleRadius - mCircleStartRadius)
+                    / (mMaxCircleSize - mCircleStartRadius);
+            fraction *= finishingFraction;
+        }
         int color = Color.argb((int) (Color.alpha(mCircleColor) * fraction),
                 Color.red(mCircleColor),
                 Color.green(mCircleColor), Color.blue(mCircleColor));
@@ -191,6 +213,8 @@
 
     public void finishAnimation(float velocity, final Runnable mAnimationEndRunnable) {
         cancelAnimator(mCircleAnimator);
+        cancelAnimator(mPreviewClipper);
+        mCircleStartRadius = mCircleRadius;
         float maxCircleSize = getMaxCircleSize();
         ValueAnimator animatorToRadius = getAnimatorToRadius(maxCircleSize);
         mFlingAnimationUtils.applyDismissing(animatorToRadius, mCircleRadius, maxCircleSize,
@@ -203,6 +227,16 @@
         });
         animatorToRadius.start();
         setImageAlpha(0, true);
+        if (mPreviewView != null) {
+            mPreviewView.setVisibility(View.VISIBLE);
+            mPreviewClipper = ViewAnimationUtils.createCircularReveal(
+                    mPreviewView, getLeft() + mCenterX, getTop() + mCenterY, mCircleRadius,
+                    maxCircleSize);
+            mFlingAnimationUtils.applyDismissing(mPreviewClipper, mCircleRadius, maxCircleSize,
+                    velocity, maxCircleSize);
+            mPreviewClipper.addListener(mClipEndListener);
+            mPreviewClipper.start();
+        }
     }
 
     private float getMaxCircleSize() {
@@ -234,6 +268,11 @@
             if (mCircleAnimator == null) {
                 mCircleRadius = circleRadius;
                 invalidate();
+                if (nowHidden) {
+                    if (mPreviewView != null) {
+                        mPreviewView.setVisibility(View.INVISIBLE);
+                    }
+                }
             } else if (!mCircleWillBeHidden) {
 
                 // We just update the end value
@@ -244,6 +283,7 @@
             }
         } else {
             cancelAnimator(mCircleAnimator);
+            cancelAnimator(mPreviewClipper);
             ValueAnimator animator = getAnimatorToRadius(circleRadius);
             Interpolator interpolator = circleRadius == 0.0f
                     ? mDisappearInterpolator
@@ -255,6 +295,22 @@
             duration = Math.min(duration, CIRCLE_DISAPPEAR_MAX_DURATION);
             animator.setDuration(duration);
             animator.start();
+            if (mPreviewView != null) {
+                mPreviewView.setVisibility(View.VISIBLE);
+                mPreviewClipper = ViewAnimationUtils.createCircularReveal(
+                        mPreviewView, getLeft() + mCenterX, getTop() + mCenterY, mCircleRadius,
+                        circleRadius);
+                mPreviewClipper.setInterpolator(interpolator);
+                mPreviewClipper.setDuration(duration);
+                mPreviewClipper.addListener(mClipEndListener);
+                mPreviewClipper.addListener(new AnimatorListenerAdapter() {
+                    @Override
+                    public void onAnimationEnd(Animator animation) {
+                        mPreviewView.setVisibility(View.INVISIBLE);
+                    }
+                });
+                mPreviewClipper.start();
+            }
         }
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index f5d4889..8bae19a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -167,6 +167,11 @@
         apply();
     }
 
+    @Override
+    public boolean hasOverlappingRendering() {
+        return false;
+    }
+
     private void applyInetProblem(ImageView iv) {
         iv.setColorFilter(Build.IS_DEBUGGABLE && mInetProblem ? PROBLEM_FILTER : null);
     }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
index a8a0cb1..9cc559f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardAffordanceHelper.java
@@ -67,7 +67,6 @@
     private Animator mSwipeAnimator;
     private int mMinBackgroundRadius;
     private boolean mMotionPerformedByUser;
-    private PowerManager mPM;
     private AnimatorListenerAdapter mFlingEndListener = new AnimatorListenerAdapter() {
         @Override
         public void onAnimationEnd(Animator animation) {
@@ -89,11 +88,12 @@
         mLeftIcon.setIsLeft(true);
         mCenterIcon = mCallback.getCenterIcon();
         mRightIcon = mCallback.getRightIcon();
+        mLeftIcon.setPreviewView(mCallback.getLeftPreview());
+        mRightIcon.setPreviewView(mCallback.getRightPreview());
         updateIcon(mLeftIcon, 0.0f, SWIPE_RESTING_ALPHA_AMOUNT, false);
         updateIcon(mCenterIcon, 0.0f, SWIPE_RESTING_ALPHA_AMOUNT, false);
         updateIcon(mRightIcon, 0.0f, SWIPE_RESTING_ALPHA_AMOUNT, false);
         initDimens();
-        mPM = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
     }
 
     private void initDimens() {
@@ -334,7 +334,6 @@
         float absTranslation = Math.abs(translation);
         if (absTranslation > Math.abs(mTranslationOnDown) + mMinTranslationAmount ||
                 mMotionPerformedByUser) {
-            userActivity();
             mMotionPerformedByUser = true;
         }
         if (translation != mTranslation || isReset) {
@@ -387,11 +386,6 @@
         return translation * BACKGROUND_RADIUS_SCALE_FACTOR + mMinBackgroundRadius;
     }
 
-
-    private void userActivity() {
-        mPM.userActivity(SystemClock.uptimeMillis(), false);
-    }
-
     public void animateHideLeftRightIcon() {
         updateIcon(mRightIcon, 0f, 0f, true);
         updateIcon(mLeftIcon, 0f, 0f, true);
@@ -475,5 +469,9 @@
         KeyguardAffordanceView getCenterIcon();
 
         KeyguardAffordanceView getRightIcon();
+
+        View getLeftPreview();
+
+        View getRightPreview();
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index b9f012c..b5f517d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -30,6 +30,7 @@
 import android.util.AttributeSet;
 import android.util.Log;
 import android.view.View;
+import android.view.ViewGroup;
 import android.view.accessibility.AccessibilityManager;
 import android.widget.FrameLayout;
 import android.widget.ImageView;
@@ -40,6 +41,7 @@
 import com.android.systemui.R;
 import com.android.systemui.statusbar.policy.FlashlightController;
 import com.android.systemui.statusbar.KeyguardAffordanceView;
+import com.android.systemui.statusbar.policy.PreviewInflater;
 
 /**
  * Implementation for the bottom area of the Keyguard, including camera/phone affordance and status
@@ -61,6 +63,10 @@
     private KeyguardAffordanceView mPhoneImageView;
     private KeyguardAffordanceView mLockIcon;
     private View mIndicationText;
+    private ViewGroup mPreviewContainer;
+
+    private View mPhonePreview;
+    private View mCameraPreview;
 
     private ActivityStarter mActivityStarter;
     private UnlockMethodCache mUnlockMethodCache;
@@ -88,6 +94,7 @@
     protected void onFinishInflate() {
         super.onFinishInflate();
         mLockPatternUtils = new LockPatternUtils(mContext);
+        mPreviewContainer = (ViewGroup) findViewById(R.id.preview_container);
         mCameraImageView = (KeyguardAffordanceView) findViewById(R.id.camera_button);
         mPhoneImageView = (KeyguardAffordanceView) findViewById(R.id.phone_button);
         mLockIcon = (KeyguardAffordanceView) findViewById(R.id.lock_icon);
@@ -101,6 +108,7 @@
         updateTrust();
         setClipChildren(false);
         setClipToPadding(false);
+        inflatePreviews();
     }
 
     public void setActivityStarter(ActivityStarter activityStarter) {
@@ -239,6 +247,14 @@
         return mCameraImageView;
     }
 
+    public View getPhonePreview() {
+        return mPhonePreview;
+    }
+
+    public View getCameraPreview() {
+        return mCameraPreview;
+    }
+
     public KeyguardAffordanceView getLockIcon() {
         return mLockIcon;
     }
@@ -258,6 +274,20 @@
         updateCameraVisibility();
     }
 
+    private void inflatePreviews() {
+        PreviewInflater inflater = new PreviewInflater(mContext, new LockPatternUtils(mContext));
+        mPhonePreview = inflater.inflatePreview(PHONE_INTENT);
+        mCameraPreview = inflater.inflatePreview(getCameraIntent());
+        if (mPhonePreview != null) {
+            mPreviewContainer.addView(mPhonePreview);
+            mPhonePreview.setVisibility(View.INVISIBLE);
+        }
+        if (mCameraPreview != null) {
+            mPreviewContainer.addView(mCameraPreview);
+            mCameraPreview.setVisibility(View.INVISIBLE);
+        }
+    }
+
     private final BroadcastReceiver mDevicePolicyReceiver = new BroadcastReceiver() {
         public void onReceive(Context context, Intent intent) {
             post(new Runnable() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 319096d..a15d35e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -36,7 +36,6 @@
     private static final float CLOCK_SCALE_FADE_END = 0.75f;
     private static final float CLOCK_SCALE_FADE_END_NO_NOTIFS = 0.5f;
 
-
     private static final float CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MIN = 1.4f;
     private static final float CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MAX = 3.2f;
 
@@ -50,6 +49,8 @@
     private int mNotificationCount;
     private int mHeight;
     private int mKeyguardStatusHeight;
+    private float mEmptyDragAmount;
+    private float mDensity;
 
     /**
      * The number (fractional) of notifications the "more" card counts when calculating how many
@@ -81,16 +82,18 @@
         mMoreCardNotificationAmount =
                 (float) res.getDimensionPixelSize(R.dimen.notification_summary_height) /
                         res.getDimensionPixelSize(R.dimen.notification_min_height);
+        mDensity = res.getDisplayMetrics().density;
     }
 
     public void setup(int maxKeyguardNotifications, int maxPanelHeight, float expandedHeight,
-            int notificationCount, int height, int keyguardStatusHeight) {
+            int notificationCount, int height, int keyguardStatusHeight, float emptyDragAmount) {
         mMaxKeyguardNotifications = maxKeyguardNotifications;
         mMaxPanelHeight = maxPanelHeight;
         mExpandedHeight = expandedHeight;
         mNotificationCount = notificationCount;
         mHeight = height;
         mKeyguardStatusHeight = keyguardStatusHeight;
+        mEmptyDragAmount = emptyDragAmount;
     }
 
     public void run(Result result) {
@@ -116,6 +119,7 @@
         float progress = distanceToScaleEnd / (startPadding - scaleEnd);
         progress = Math.max(0.0f, Math.min(progress, 1.0f));
         progress = mAccelerateInterpolator.getInterpolation(progress);
+        progress *= Math.pow(1 + mEmptyDragAmount / mDensity / 300, 0.3f);
         return progress;
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardPreviewContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardPreviewContainer.java
new file mode 100644
index 0000000..7579039
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardPreviewContainer.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2014 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.systemui.statusbar.phone;
+
+import android.content.Context;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorFilter;
+import android.graphics.Rect;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.WindowInsets;
+import android.widget.FrameLayout;
+
+/**
+ * A view group which contains the preview of phone/camera and draws a black bar at the bottom as
+ * the fake navigation bar.
+ */
+public class KeyguardPreviewContainer extends FrameLayout {
+
+    private Drawable mBlackBarDrawable = new Drawable() {
+        @Override
+        public void draw(Canvas canvas) {
+            canvas.save();
+            canvas.clipRect(0, getHeight() - getPaddingBottom(), getWidth(), getHeight());
+            canvas.drawColor(Color.BLACK);
+            canvas.restore();
+        }
+
+        @Override
+        public void setAlpha(int alpha) {
+            // noop
+        }
+
+        @Override
+        public void setColorFilter(ColorFilter cf) {
+            // noop
+        }
+
+        @Override
+        public int getOpacity() {
+            return android.graphics.PixelFormat.OPAQUE;
+        }
+    };
+
+    public KeyguardPreviewContainer(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        setBackground(mBlackBarDrawable);
+    }
+
+    @Override
+    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
+        setPadding(0, 0, 0, insets.getStableInsetBottom());
+        return super.onApplyWindowInsets(insets);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 11a38b5..909972a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -45,8 +45,6 @@
 import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
 import com.android.systemui.statusbar.stack.StackStateAnimator;
 
-import java.util.ArrayList;
-
 public class NotificationPanelView extends PanelView implements
         ExpandableView.OnHeightChangedListener, ObservableScrollView.Listener,
         View.OnClickListener, NotificationStackScrollLayout.OnOverscrollTopChangedListener,
@@ -112,6 +110,7 @@
     private boolean mUnlockIconActive;
     private int mNotificationsHeaderCollideDistance;
     private int mUnlockMoveDistance;
+    private float mEmptyDragAmount;
 
     private Interpolator mFastOutSlowInInterpolator;
     private Interpolator mFastOutLinearInterpolator;
@@ -236,7 +235,8 @@
                     getExpandedHeight(),
                     mNotificationStackScroller.getNotGoneChildCount(),
                     getHeight(),
-                    mKeyguardStatusView.getHeight());
+                    mKeyguardStatusView.getHeight(),
+                    mEmptyDragAmount);
             mClockPositionAlgorithm.run(mClockPositionResult);
             if (animate || mClockAnimator != null) {
                 startClockAnimation(mClockPositionResult.clockY);
@@ -1257,6 +1257,20 @@
     }
 
     @Override
+    public View getLeftPreview() {
+        return getLayoutDirection() == LAYOUT_DIRECTION_RTL
+                ? mKeyguardBottomArea.getCameraPreview()
+                : mKeyguardBottomArea.getPhonePreview();
+    }
+
+    @Override
+    public View getRightPreview() {
+        return getLayoutDirection() == LAYOUT_DIRECTION_RTL
+                ? mKeyguardBottomArea.getPhonePreview()
+                : mKeyguardBottomArea.getCameraPreview();
+    }
+
+    @Override
     protected float getPeekHeight() {
         if (mNotificationStackScroller.getNotGoneChildCount() > 0) {
             return mNotificationStackScroller.getPeekHeight();
@@ -1307,4 +1321,15 @@
     public void setLaunchTransitionEndRunnable(Runnable r) {
         mLaunchAnimationEndRunnable = r;
     }
+
+    public void setEmptyDragAmount(float amount) {
+        float factor = 1f;
+        if (mNotificationStackScroller.getNotGoneChildCount() > 0) {
+            factor = 0.6f;
+        } else if (!mStatusBar.hasNotifications()) {
+            factor = 0.4f;
+        }
+        mEmptyDragAmount = amount * factor;
+        positionClockAndNotifications();
+    }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index d55e738..044f69c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -70,7 +70,6 @@
 import android.os.PowerManager;
 import android.os.RemoteException;
 import android.os.SystemClock;
-import android.os.Trace;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.service.notification.NotificationListenerService.RankingMap;
@@ -130,6 +129,7 @@
 import com.android.systemui.statusbar.SpeedBumpView;
 import com.android.systemui.statusbar.StatusBarIconView;
 import com.android.systemui.statusbar.StatusBarState;
+import com.android.systemui.statusbar.policy.NextAlarmController;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
 import com.android.systemui.statusbar.policy.BluetoothControllerImpl;
@@ -159,7 +159,7 @@
 import java.util.List;
 
 public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
-        DragDownHelper.OnDragDownListener, ActivityStarter {
+        DragDownHelper.DragDownCallback, ActivityStarter {
     static final String TAG = "PhoneStatusBar";
     public static final boolean DEBUG = BaseStatusBar.DEBUG;
     public static final boolean SPEW = false;
@@ -224,6 +224,7 @@
     KeyguardUserSwitcher mKeyguardUserSwitcher;
     FlashlightController mFlashlightController;
     UserSwitcherController mUserSwitcherController;
+    NextAlarmController mNextAlarmController;
     KeyguardMonitor mKeyguardMonitor;
 
     int mNaturalBarHeight = -1;
@@ -282,7 +283,6 @@
     private long mKeyguardFadingAwayDuration;
 
     int mKeyguardMaxNotificationCount;
-    View mDateTimeView;
 
     // carrier/wifi label
     private TextView mCarrierLabel;
@@ -453,6 +453,8 @@
     private Runnable mLaunchTransitionEndRunnable;
     private boolean mLaunchTransitionFadingAway;
 
+    private boolean mHasNotifications;
+
     private static final int VISIBLE_LOCATIONS = ViewState.LOCATION_FIRST_CARD
             | ViewState.LOCATION_TOP_STACK_PEEKING
             | ViewState.LOCATION_MAIN_AREA
@@ -702,12 +704,6 @@
                 (KeyguardIndicationTextView) mStatusBarWindow.findViewById(
                         R.id.keyguard_indication_text));
 
-        mDateTimeView = mHeader.findViewById(R.id.datetime);
-        if (mDateTimeView != null) {
-            mDateTimeView.setOnClickListener(mClockClickListener);
-            mDateTimeView.setEnabled(true);
-        }
-
         mTickerEnabled = res.getBoolean(R.bool.enable_ticker);
         if (mTickerEnabled) {
             final ViewStub tickerStub = (ViewStub) mStatusBarView.findViewById(R.id.ticker_stub);
@@ -784,6 +780,7 @@
         mFlashlightController = new FlashlightController(mContext);
         mKeyguardBottomArea.setFlashlightController(mFlashlightController);
         mUserSwitcherController = new UserSwitcherController(mContext);
+        mNextAlarmController = new NextAlarmController(mContext);
         mKeyguardMonitor = new KeyguardMonitor();
 
         mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
@@ -815,6 +812,7 @@
         mUserInfoController.reloadUserInfo();
 
         mHeader.setBatteryController(mBatteryController);
+        mHeader.setNextAlarmController(mNextAlarmController);
 
         PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
         mBroadcastReceiver.onReceive(mContext,
@@ -1317,8 +1315,12 @@
             updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
 
             if (CLOSE_PANEL_WHEN_EMPTIED && mNotificationData.size() == 0
-                    && !mNotificationPanel.isTracking() && mState != StatusBarState.KEYGUARD) {
-                animateCollapsePanels();
+                    && !mNotificationPanel.isTracking()) {
+                if (mState == StatusBarState.SHADE) {
+                    animateCollapsePanels();
+                } else if (mState == StatusBarState.SHADE_LOCKED) {
+                    goToKeyguard();
+                }
             }
         }
         setAreThereNotifications();
@@ -1614,6 +1616,9 @@
         findAndUpdateMediaNotifications();
 
         updateCarrierLabelVisibility(false);
+
+        // TODO: Multiuser handling!
+        mHasNotifications = any;
     }
 
     public void findAndUpdateMediaNotifications() {
@@ -2346,6 +2351,13 @@
     }
 
     @Override // CommandQueue
+    public void buzzBeepBlinked() {
+        if (mDozeServiceHost != null) {
+            mDozeServiceHost.fireBuzzBeepBlinked();
+        }
+    }
+
+    @Override // CommandQueue
     public void setSystemUiVisibility(int vis, int mask) {
         final int oldVal = mSystemUiVisibility;
         final int newVal = (oldVal&~mask) | (vis&mask);
@@ -2795,6 +2807,9 @@
         if (mBatteryController != null) {
             mBatteryController.dump(fd, pw, args);
         }
+        if (mNextAlarmController != null) {
+            mNextAlarmController.dump(fd, pw, args);
+        }
     }
 
     private String hunStateToString(Entry entry) {
@@ -2851,6 +2866,7 @@
     public void startActivityDismissingKeyguard(final Intent intent, boolean onlyProvisioned) {
         if (onlyProvisioned && !isDeviceProvisioned()) return;
 
+        final boolean keyguardShowing = mStatusBarKeyguardViewManager.isShowing();
         dismissKeyguardThenExecute(new OnDismissAction() {
             @Override
             public boolean onDismiss() {
@@ -2861,7 +2877,10 @@
                                     Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
                             mContext.startActivityAsUser(
                                     intent, new UserHandle(UserHandle.USER_CURRENT));
-                            mWindowManagerService.overridePendingAppTransition(null, 0, 0, null);
+                            if (keyguardShowing) {
+                                mWindowManagerService.overridePendingAppTransition(
+                                        null, 0, 0, null);
+                            }
                         } catch (RemoteException e) {
                         }
                     }
@@ -2886,11 +2905,9 @@
             String action = intent.getAction();
             if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
                 int flags = CommandQueue.FLAG_EXCLUDE_NONE;
-                if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
-                    String reason = intent.getStringExtra("reason");
-                    if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
-                        flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
-                    }
+                String reason = intent.getStringExtra("reason");
+                if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
+                    flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
                 }
                 animateCollapsePanels(flags);
             }
@@ -3592,8 +3609,17 @@
     // ---------------------- DragDownHelper.OnDragDownListener ------------------------------------
 
     @Override
-    public void onDraggedDown(View startingChild) {
-        goToLockedShade(startingChild);
+    public boolean onDraggedDown(View startingChild) {
+        if (mHasNotifications) {
+
+            // We have notifications, go to locked shade.
+            goToLockedShade(startingChild);
+            return true;
+        } else {
+
+            // No notifications - abort gesture.
+            return false;
+        }
     }
 
     @Override
@@ -3601,6 +3627,7 @@
         mStackScroller.setDimmed(true /* dimmed */, true /* animated */);
     }
 
+    @Override
     public void onThresholdReached() {
         mStackScroller.setDimmed(false /* dimmed */, true /* animate */);
     }
@@ -3610,6 +3637,11 @@
         mStackScroller.removeLongPressCallback();
     }
 
+    @Override
+    public void setEmptyDragAmount(float amount) {
+        mNotificationPanel.setEmptyDragAmount(amount);
+    }
+
     /**
      * If secure with redaction: Show bouncer, go to unlocked shade.
      *
@@ -3720,6 +3752,10 @@
         notifyUiVisibilityChanged(mSystemUiVisibility);
     }
 
+    public boolean hasNotifications() {
+        return mHasNotifications;
+    }
+
     private final class ShadeUpdates {
         private final ArraySet<String> mVisibleNotifications = new ArraySet<String>();
         private final ArraySet<String> mNewVisibleNotifications = new ArraySet<String>();
@@ -3757,6 +3793,12 @@
 
         private DozeService mCurrentDozeService;
 
+        public void fireBuzzBeepBlinked() {
+            for (Callback callback : mCallbacks) {
+                callback.onBuzzBeepBlinked();
+            }
+        }
+
         public void fireNewNotifications() {
             for (Callback callback : mCallbacks) {
                 callback.onNewNotifications();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index 65359ee..7b40d72 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.statusbar.phone;
 
+import android.app.AlarmClockInfo;
+import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Outline;
@@ -31,18 +33,20 @@
 import android.widget.Switch;
 import android.widget.TextView;
 
+import com.android.keyguard.KeyguardStatusView;
 import com.android.systemui.R;
 import com.android.systemui.qs.QSPanel;
 import com.android.systemui.qs.QSTile;
 import com.android.systemui.statusbar.policy.BatteryController;
 import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
+import com.android.systemui.statusbar.policy.NextAlarmController;
 import com.android.systemui.statusbar.policy.UserInfoController;
 
 /**
  * The view to manage the header area in the expanded status bar.
  */
 public class StatusBarHeaderView extends RelativeLayout implements View.OnClickListener,
-        BatteryController.BatteryStateChangeCallback {
+        BatteryController.BatteryStateChangeCallback, NextAlarmController.NextAlarmChangeCallback {
 
     private boolean mExpanded;
     private boolean mListening;
@@ -52,7 +56,8 @@
 
     private ViewGroup mSystemIconsContainer;
     private View mSystemIconsSuperContainer;
-    private View mDateTime;
+    private View mDateGroup;
+    private View mClock;
     private View mTime;
     private View mAmPm;
     private View mKeyguardCarrierText;
@@ -68,9 +73,12 @@
     private Switch mQsDetailHeaderSwitch;
     private View mEmergencyCallsOnly;
     private TextView mBatteryLevel;
+    private TextView mAlarmStatus;
 
     private boolean mShowEmergencyCallsOnly;
     private boolean mKeyguardUserSwitcherShowing;
+    private boolean mAlarmShowing;
+    private AlarmClockInfo mNextAlarm;
 
     private int mCollapsedHeight;
     private int mExpandedHeight;
@@ -84,9 +92,13 @@
     private int mMultiUserKeyguardMargin;
     private int mSystemIconsSwitcherHiddenExpandedMargin;
     private int mClockMarginBottomExpanded;
+    private int mClockMarginBottomCollapsed;
     private int mMultiUserSwitchWidthCollapsed;
     private int mMultiUserSwitchWidthExpanded;
+    private int mMultiUserSwitchWidthKeyguard;
     private int mBatteryPaddingEnd;
+    private int mBatteryMarginExpanded;
+    private int mBatteryMarginKeyguard;
 
     /**
      * In collapsed QS, the clock and avatar are scaled down a bit post-layout to allow for a nice
@@ -94,9 +106,11 @@
      */
     private float mClockCollapsedScaleFactor;
     private float mAvatarCollapsedScaleFactor;
+    private float mAvatarKeyguardScaleFactor;
 
     private ActivityStarter mActivityStarter;
     private BatteryController mBatteryController;
+    private NextAlarmController mNextAlarmController;
     private QSPanel mQSPanel;
     private KeyguardUserSwitcher mKeyguardUserSwitcher;
 
@@ -113,7 +127,8 @@
         mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
         mSystemIconsContainer = (ViewGroup) findViewById(R.id.system_icons_container);
         mSystemIconsSuperContainer.setOnClickListener(this);
-        mDateTime = findViewById(R.id.datetime);
+        mDateGroup = findViewById(R.id.date_group);
+        mClock = findViewById(R.id.clock);
         mTime = findViewById(R.id.time_view);
         mAmPm = findViewById(R.id.am_pm_view);
         mKeyguardCarrierText = findViewById(R.id.keyguard_carrier_text);
@@ -129,6 +144,8 @@
         mQsDetailHeaderSwitch = (Switch) mQsDetailHeader.findViewById(android.R.id.toggle);
         mEmergencyCallsOnly = findViewById(R.id.header_emergency_calls_only);
         mBatteryLevel = (TextView) findViewById(R.id.battery_level);
+        mAlarmStatus = (TextView) findViewById(R.id.alarm_status);
+        mAlarmStatus.setOnClickListener(this);
         loadDimens();
         updateVisibilities();
         updateClockScale();
@@ -175,18 +192,29 @@
                 R.dimen.system_icons_switcher_hidden_expanded_margin);
         mClockMarginBottomExpanded =
                 getResources().getDimensionPixelSize(R.dimen.clock_expanded_bottom_margin);
+        mClockMarginBottomCollapsed =
+                getResources().getDimensionPixelSize(R.dimen.clock_collapsed_bottom_margin);
         mMultiUserSwitchWidthCollapsed =
                 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_collapsed);
         mMultiUserSwitchWidthExpanded =
                 getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_expanded);
+        mMultiUserSwitchWidthKeyguard =
+                getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_keyguard);
         mAvatarCollapsedScaleFactor =
                 getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_collapsed_size)
                 / (float) mMultiUserAvatar.getLayoutParams().width;
+        mAvatarKeyguardScaleFactor =
+                getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_keyguard_size)
+                        / (float) mMultiUserAvatar.getLayoutParams().width;
         mClockCollapsedScaleFactor =
                 (float) getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size)
                 / (float) getResources().getDimensionPixelSize(R.dimen.qs_time_expanded_size);
         mBatteryPaddingEnd =
                 getResources().getDimensionPixelSize(R.dimen.battery_level_padding_end);
+        mBatteryMarginExpanded =
+                getResources().getDimensionPixelSize(R.dimen.header_battery_margin_expanded);
+        mBatteryMarginKeyguard =
+                getResources().getDimensionPixelSize(R.dimen.header_battery_margin_keyguard);
     }
 
     public void setActivityStarter(ActivityStarter activityStarter) {
@@ -197,6 +225,10 @@
         mBatteryController = batteryController;
     }
 
+    public void setNextAlarmController(NextAlarmController nextAlarmController) {
+        mNextAlarmController = nextAlarmController;
+    }
+
     public int getCollapsedHeight() {
         return mKeyguardShowing ? mKeyguardHeight : mCollapsedHeight;
     }
@@ -210,7 +242,7 @@
             return;
         }
         mListening = listening;
-        updateBatteryListening();
+        updateListeners();
     }
 
     public void setExpanded(boolean expanded, boolean overscrolled) {
@@ -234,6 +266,7 @@
             updateAvatarScale();
             updateClockLp();
             updateBatteryLevelPaddingEnd();
+            updateBatteryLevelLp();
             mStatusIconClipper.update();
         }
     }
@@ -282,10 +315,15 @@
         } else {
             setBackgroundResource(R.drawable.notification_header_bg);
         }
-        mDateTime.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
+        mDateGroup.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
+        mClock.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
         mKeyguardCarrierText.setVisibility(onKeyguardAndCollapsed ? View.VISIBLE : View.GONE);
-        mDateCollapsed.setVisibility(mExpanded && !mOverscrolled ? View.GONE : View.VISIBLE);
-        mDateExpanded.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE);
+        mDateCollapsed.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
+                ? View.VISIBLE : View.GONE);
+        mDateExpanded.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
+                ? View.GONE : View.VISIBLE);
+        mAlarmStatus.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
+                ? View.VISIBLE : View.GONE);
         mSettingsButton.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.GONE);
         mQsDetailHeader.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
         if (mStatusIcons != null) {
@@ -319,21 +357,26 @@
         mSystemIconsSuperContainer.setLayoutParams(lp);
     }
 
-    private void updateBatteryListening() {
+    private void updateListeners() {
         if (mListening) {
             mBatteryController.addStateChangedCallback(this);
+            mNextAlarmController.addStateChangedCallback(this);
         } else {
             mBatteryController.removeStateChangedCallback(this);
+            mNextAlarmController.removeStateChangedCallback(this);
         }
     }
 
     private void updateAvatarScale() {
-        if (!mExpanded || mOverscrolled) {
-            mMultiUserSwitch.setScaleX(mAvatarCollapsedScaleFactor);
-            mMultiUserSwitch.setScaleY(mAvatarCollapsedScaleFactor);
-        } else {
+        if (mExpanded && !mOverscrolled) {
             mMultiUserSwitch.setScaleX(1f);
             mMultiUserSwitch.setScaleY(1f);
+        } else if (mKeyguardShowing) {
+            mMultiUserSwitch.setScaleX(mAvatarKeyguardScaleFactor);
+            mMultiUserSwitch.setScaleY(mAvatarKeyguardScaleFactor);
+        } else {
+            mMultiUserSwitch.setScaleX(mAvatarCollapsedScaleFactor);
+            mMultiUserSwitch.setScaleY(mAvatarCollapsedScaleFactor);
         }
     }
 
@@ -375,15 +418,26 @@
         // could not care less
     }
 
+    @Override
+    public void onNextAlarmChanged(AlarmClockInfo nextAlarm) {
+        mNextAlarm = nextAlarm;
+        if (nextAlarm != null) {
+            mAlarmStatus.setText(KeyguardStatusView.formatNextAlarm(getContext(), nextAlarm));
+        }
+        mAlarmShowing = nextAlarm != null;
+        updateVisibilities();
+    }
+
+
     private void updateClickTargets() {
         setClickable(!mKeyguardShowing || mExpanded);
-        mDateTime.setClickable(mExpanded);
 
         boolean keyguardSwitcherAvailable =
                 mKeyguardUserSwitcher != null && mKeyguardShowing && !mExpanded;
         mMultiUserSwitch.setClickable(mExpanded || keyguardSwitcherAvailable);
         mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
         mSystemIconsSuperContainer.setClickable(mExpanded);
+        mAlarmStatus.setClickable(mNextAlarm != null && mNextAlarm.getShowIntent() != null);
     }
 
     private void updateZTranslation() {
@@ -404,29 +458,29 @@
     }
 
     private void updateClockLp() {
-        int marginBottom = mExpanded && !mOverscrolled ? mClockMarginBottomExpanded : 0;
-        LayoutParams lp = (LayoutParams) mDateTime.getLayoutParams();
-        int rule = mExpanded && !mOverscrolled ? TRUE : 0;
-        if (marginBottom != lp.bottomMargin
-                || lp.getRules()[RelativeLayout.ALIGN_PARENT_BOTTOM] != rule) {
+        int marginBottom = mExpanded && !mOverscrolled
+                ? mClockMarginBottomExpanded
+                : mClockMarginBottomCollapsed;
+        LayoutParams lp = (LayoutParams) mDateGroup.getLayoutParams();
+        if (marginBottom != lp.bottomMargin) {
             lp.bottomMargin = marginBottom;
-            lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, rule);
-            mDateTime.setLayoutParams(lp);
+            mDateGroup.setLayoutParams(lp);
         }
     }
 
     private void updateMultiUserSwitch() {
         int marginEnd;
+        int width;
         if (mExpanded && !mOverscrolled) {
             marginEnd = mMultiUserExpandedMargin;
+            width = mMultiUserSwitchWidthExpanded;
         } else if (mKeyguardShowing) {
             marginEnd = mMultiUserKeyguardMargin;
+            width = mMultiUserSwitchWidthKeyguard;
         } else {
             marginEnd = mMultiUserCollapsedMargin;
+            width = mMultiUserSwitchWidthCollapsed;
         }
-        int width = mExpanded && !mOverscrolled
-                ? mMultiUserSwitchWidthExpanded
-                : mMultiUserSwitchWidthCollapsed;
         MarginLayoutParams lp = (MarginLayoutParams) mMultiUserSwitch.getLayoutParams();
         if (marginEnd != lp.getMarginEnd() || lp.width != width) {
             lp.setMarginEnd(marginEnd);
@@ -435,6 +489,17 @@
         }
     }
 
+    private void updateBatteryLevelLp() {
+        int marginStart = mExpanded && !mOverscrolled
+                ? mBatteryMarginExpanded
+                : mBatteryMarginKeyguard;
+        MarginLayoutParams lp = (MarginLayoutParams) mBatteryLevel.getLayoutParams();
+        if (marginStart != lp.getMarginStart()) {
+            lp.setMarginStart(marginStart);
+            mBatteryLevel.setLayoutParams(lp);
+        }
+    }
+
     public void setExpansion(float t) {
         float height = mCollapsedHeight + t * (mExpandedHeight - mCollapsedHeight);
         if (height < mCollapsedHeight) {
@@ -481,6 +546,7 @@
         updateMultiUserSwitch();
         updateClickTargets();
         updateBatteryLevelPaddingEnd();
+        updateAvatarScale();
         mStatusIconClipper.update();
     }
 
@@ -499,6 +565,11 @@
             startSettingsActivity();
         } else if (v == mSystemIconsSuperContainer) {
             startBatteryActivity();
+        } else if (v == mAlarmStatus && mNextAlarm != null) {
+            PendingIntent showIntent = mNextAlarm.getShowIntent();
+            if (showIntent != null && showIntent.isActivity()) {
+                mActivityStarter.startActivity(showIntent.getIntent());
+            }
         }
     }
 
@@ -613,7 +684,8 @@
 
         private void handleShowingDetail(final QSTile.DetailAdapter detail) {
             final boolean showingDetail = detail != null;
-            transition(mDateTime, !showingDetail);
+            transition(mClock, !showingDetail);
+            transition(mDateGroup, !showingDetail);
             transition(mQsDetailHeader, showingDetail);
             if (showingDetail) {
                 mQsDetailHeaderTitle.setText(detail.getTitle());
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index 6d8b400..b64dcbe 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -24,7 +24,7 @@
     void setWifiEnabled(boolean enabled);
 
     public interface NetworkSignalChangedCallback {
-        void onWifiSignalChanged(boolean enabled, int wifiSignalIconId,
+        void onWifiSignalChanged(boolean enabled, boolean connected, int wifiSignalIconId,
                 boolean activityIn, boolean activityOut,
                 String wifiSignalContentDescriptionId, String description);
         void onMobileDataSignalChanged(boolean enabled, int mobileSignalIconId,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 2b08902..4fc2e06 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -401,7 +401,7 @@
         boolean wifiOut = wifiEnabled && mWifiSsid != null
                 && (mWifiActivity == WifiManager.DATA_ACTIVITY_INOUT
                 || mWifiActivity == WifiManager.DATA_ACTIVITY_OUT);
-        cb.onWifiSignalChanged(mWifiEnabled, mQSWifiIconId, wifiIn, wifiOut,
+        cb.onWifiSignalChanged(mWifiEnabled, mWifiConnected, mQSWifiIconId, wifiIn, wifiOut,
                 mContentDescriptionWifi, wifiDesc);
 
         boolean mobileIn = mDataConnected && (mDataActivity == TelephonyManager.DATA_ACTIVITY_INOUT
@@ -573,9 +573,11 @@
             switch(mServiceState.getVoiceRegState()) {
                 case ServiceState.STATE_POWER_OFF:
                     retVal = false;
+                    break;
                 case ServiceState.STATE_OUT_OF_SERVICE:
                 case ServiceState.STATE_EMERGENCY_ONLY:
                     retVal = mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
+                    break;
                 default:
                     retVal = true;
             }
@@ -597,8 +599,8 @@
 
     private final void updateTelephonySignalStrength() {
         Rlog.d(TAG, "updateTelephonySignalStrength: hasService=" + hasService() + " ss=" + mSignalStrength);
-        if (false/*!hasService()*/) {
-            if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: !hasService()");
+        if (!hasService()) {
+            if (true/*CHATTY*/) Log.d(TAG, "updateTelephonySignalStrength: !hasService()");
             mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
             mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;
             mDataSignalIconId = R.drawable.stat_sys_signal_null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmController.java
new file mode 100644
index 0000000..ca71521
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NextAlarmController.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2014 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.systemui.statusbar.policy;
+
+import android.app.AlarmClockInfo;
+import android.app.AlarmManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.UserHandle;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+public class NextAlarmController extends BroadcastReceiver {
+
+    private final ArrayList<NextAlarmChangeCallback> mChangeCallbacks = new ArrayList<>();
+
+    private AlarmManager mAlarmManager;
+    private AlarmClockInfo mNextAlarm;
+
+    public NextAlarmController(Context context) {
+        mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(Intent.ACTION_USER_SWITCHED);
+        filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
+        context.registerReceiver(this, filter);
+        updateNextAlarm();
+    }
+
+    public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+        pw.println("NextAlarmController state:");
+        pw.print("  mNextAlarm="); pw.println(mNextAlarm);
+    }
+
+    public void addStateChangedCallback(NextAlarmChangeCallback cb) {
+        mChangeCallbacks.add(cb);
+        cb.onNextAlarmChanged(mNextAlarm);
+    }
+
+    public void removeStateChangedCallback(NextAlarmChangeCallback cb) {
+        mChangeCallbacks.remove(cb);
+    }
+
+    public void onReceive(Context context, Intent intent) {
+        final String action = intent.getAction();
+        if (action.equals(Intent.ACTION_USER_SWITCHED)
+                || action.equals(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED)) {
+            updateNextAlarm();
+        }
+    }
+
+    private void updateNextAlarm() {
+        mNextAlarm = mAlarmManager.getNextAlarmClock(UserHandle.USER_CURRENT);
+        fireNextAlarmChanged();
+    }
+
+    private void fireNextAlarmChanged() {
+        int n = mChangeCallbacks.size();
+        for (int i = 0; i < n; i++) {
+            mChangeCallbacks.get(i).onNextAlarmChanged(mNextAlarm);
+        }
+    }
+
+    public interface NextAlarmChangeCallback {
+        void onNextAlarmChanged(AlarmClockInfo nextAlarm);
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java
new file mode 100644
index 0000000..d405172
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/PreviewInflater.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2014 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.systemui.statusbar.policy;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.os.UserHandle;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+
+import com.android.internal.widget.LockPatternUtils;
+import com.android.keyguard.KeyguardActivityLauncher;
+import com.android.systemui.statusbar.phone.KeyguardPreviewContainer;
+
+import java.util.List;
+
+/**
+ * Utility class to inflate previews for phone and camera affordance.
+ */
+public class PreviewInflater {
+
+    private static final String TAG = "PreviewInflater";
+
+    private static final String META_DATA_KEYGUARD_LAYOUT = "com.android.keyguard.layout";
+
+    private Context mContext;
+    private LockPatternUtils mLockPatternUtils;
+
+    public PreviewInflater(Context context, LockPatternUtils lockPatternUtils) {
+        mContext = context;
+        mLockPatternUtils = lockPatternUtils;
+    }
+
+    public View inflatePreview(Intent intent) {
+        WidgetInfo info = getWidgetInfo(intent);
+        if (info == null) {
+            return null;
+        }
+        View v = inflateWidgetView(info);
+        if (v == null) {
+            return null;
+        }
+        KeyguardPreviewContainer container = new KeyguardPreviewContainer(mContext, null);
+        container.addView(v);
+        return container;
+    }
+
+    private View inflateWidgetView(WidgetInfo widgetInfo) {
+        View widgetView = null;
+        try {
+            Context appContext = mContext.createPackageContext(
+                    widgetInfo.contextPackage, Context.CONTEXT_RESTRICTED);
+            LayoutInflater appInflater = (LayoutInflater)
+                    appContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+            appInflater = appInflater.cloneInContext(appContext);
+            widgetView = appInflater.inflate(widgetInfo.layoutId, null, false);
+        } catch (PackageManager.NameNotFoundException|RuntimeException e) {
+            Log.w(TAG, "Error creating widget view", e);
+        }
+        return widgetView;
+    }
+
+    private WidgetInfo getWidgetInfo(Intent intent) {
+        WidgetInfo info = new WidgetInfo();
+        PackageManager packageManager = mContext.getPackageManager();
+        final List<ResolveInfo> appList = packageManager.queryIntentActivitiesAsUser(
+                intent, PackageManager.MATCH_DEFAULT_ONLY, mLockPatternUtils.getCurrentUser());
+        if (appList.size() == 0) {
+            return null;
+        }
+        ResolveInfo resolved = packageManager.resolveActivityAsUser(intent,
+                PackageManager.MATCH_DEFAULT_ONLY | PackageManager.GET_META_DATA,
+                mLockPatternUtils.getCurrentUser());
+        if (wouldLaunchResolverActivity(resolved, appList)) {
+            return null;
+        }
+        if (resolved == null || resolved.activityInfo == null) {
+            return null;
+        }
+        if (resolved.activityInfo.metaData == null || resolved.activityInfo.metaData.isEmpty()) {
+            return null;
+        }
+        int layoutId = resolved.activityInfo.metaData.getInt(META_DATA_KEYGUARD_LAYOUT);
+        if (layoutId == 0) {
+            return null;
+        }
+        info.contextPackage = resolved.activityInfo.packageName;
+        info.layoutId = layoutId;
+        return info;
+    }
+
+    private boolean wouldLaunchResolverActivity(ResolveInfo resolved, List<ResolveInfo> appList) {
+        // If the list contains the above resolved activity, then it can't be
+        // ResolverActivity itself.
+        for (int i = 0; i < appList.size(); i++) {
+            ResolveInfo tmp = appList.get(i);
+            if (tmp.activityInfo.name.equals(resolved.activityInfo.name)
+                    && tmp.activityInfo.packageName.equals(resolved.activityInfo.packageName)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private static class WidgetInfo {
+        String contextPackage;
+        int layoutId;
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index d0f61f0..a123bf7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -95,6 +95,10 @@
     public void setWindowState(int window, int state) {
     }
 
+    @Override // CommandQueue
+    public void buzzBeepBlinked() {
+    }
+
     @Override
     protected WindowManager.LayoutParams getSearchLayoutParams(
             LayoutParams layoutParams) {
diff --git a/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java b/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java
index 5c8a8ef8..57b0731 100644
--- a/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java
+++ b/packages/WallpaperCropper/src/com/android/wallpapercropper/WallpaperCropActivity.java
@@ -133,6 +133,14 @@
         setCropViewTileSource(bitmapSource, true, false, onLoad);
     }
 
+    @Override
+    protected void onDestroy() {
+        if (mCropView != null) {
+            mCropView.destroy();
+        }
+        super.onDestroy();
+    }
+
     public void setCropViewTileSource(
             final BitmapRegionTileSource.BitmapSource bitmapSource, final boolean touchEnabled,
             final boolean moveToLeft, final Runnable postExecute) {
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index 392c280..3e75947 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -211,6 +211,9 @@
 
     private float mElevation;
 
+    /** Whether window content should be clipped to the background outline. */
+    private boolean mClipToOutline;
+
     private int mFrameResource = 0;
 
     private int mTextColor = 0;
@@ -1173,7 +1176,7 @@
                 mDecorContentParent != null) {
             final TypedValue outValue = new TypedValue();
             final Theme baseTheme = context.getTheme();
-            baseTheme.resolveAttribute(com.android.internal.R.attr.actionBarTheme, outValue, true);
+            baseTheme.resolveAttribute(R.attr.actionBarTheme, outValue, true);
 
             Theme widgetTheme = null;
             if (outValue.resourceId != 0) {
@@ -1181,10 +1184,10 @@
                 widgetTheme.setTo(baseTheme);
                 widgetTheme.applyStyle(outValue.resourceId, true);
                 widgetTheme.resolveAttribute(
-                        com.android.internal.R.attr.actionBarWidgetTheme, outValue, true);
+                        R.attr.actionBarWidgetTheme, outValue, true);
             } else {
                 baseTheme.resolveAttribute(
-                        com.android.internal.R.attr.actionBarWidgetTheme, outValue, true);
+                        R.attr.actionBarWidgetTheme, outValue, true);
             }
 
             if (outValue.resourceId != 0) {
@@ -1305,6 +1308,7 @@
             mBackgroundDrawable = drawable;
             if (mDecor != null) {
                 mDecor.setWindowBackground(drawable);
+                mDecor.setClipToOutline(drawable != null && mClipToOutline);
             }
         }
     }
@@ -1428,7 +1432,7 @@
         if (featureId == FEATURE_PROGRESS || featureId == FEATURE_INDETERMINATE_PROGRESS) {
             updateProgressBars(value);
         } else if (featureId == FEATURE_CUSTOM_TITLE) {
-            FrameLayout titleContainer = (FrameLayout) findViewById(com.android.internal.R.id.title_container);
+            FrameLayout titleContainer = (FrameLayout) findViewById(R.id.title_container);
             if (titleContainer != null) {
                 mLayoutInflater.inflate(value, titleContainer);
             }
@@ -1546,7 +1550,7 @@
 
     private void hideProgressBars(ProgressBar horizontalProgressBar, ProgressBar spinnyProgressBar) {
         final int features = getLocalFeatures();
-        Animation anim = AnimationUtils.loadAnimation(getContext(), com.android.internal.R.anim.fade_out);
+        Animation anim = AnimationUtils.loadAnimation(getContext(), R.anim.fade_out);
         anim.setDuration(1000);
         if ((features & (1 << FEATURE_INDETERMINATE_PROGRESS)) != 0 &&
                 spinnyProgressBar != null &&
@@ -2440,7 +2444,7 @@
                             && getAttributes().height
                             == WindowManager.LayoutParams.MATCH_PARENT) {
                         mMenuBackground = getContext().getDrawable(
-                                com.android.internal.R.drawable.menu_background);
+                                R.drawable.menu_background);
                     }
                     if (mMenuBackground != null) {
                         mMenuBackground.setBounds(drawingBounds.left,
@@ -2606,7 +2610,7 @@
                     if (isFloating()) {
                         mActionModeView = new ActionBarContextView(mContext);
                         mActionModePopup = new PopupWindow(mContext, null,
-                                com.android.internal.R.attr.actionModePopupWindowStyle);
+                                R.attr.actionModePopupWindowStyle);
                         mActionModePopup.setWindowLayoutType(
                                 WindowManager.LayoutParams.TYPE_APPLICATION);
                         mActionModePopup.setContentView(mActionModeView);
@@ -2614,7 +2618,7 @@
 
                         TypedValue heightValue = new TypedValue();
                         mContext.getTheme().resolveAttribute(
-                                com.android.internal.R.attr.actionBarSize, heightValue, true);
+                                R.attr.actionBarSize, heightValue, true);
                         final int height = TypedValue.complexToDimensionPixelSize(heightValue.data,
                                 mContext.getResources().getDisplayMetrics());
                         mActionModeView.setContentHeight(height);
@@ -2628,7 +2632,7 @@
                         };
                     } else {
                         ViewStub stub = (ViewStub) findViewById(
-                                com.android.internal.R.id.action_mode_bar_stub);
+                                R.id.action_mode_bar_stub);
                         if (stub != null) {
                             mActionModeView = (ActionBarContextView) stub.inflate();
                         }
@@ -3093,14 +3097,14 @@
         if (false) {
             System.out.println("From style:");
             String s = "Attrs:";
-            for (int i = 0; i < com.android.internal.R.styleable.Window.length; i++) {
-                s = s + " " + Integer.toHexString(com.android.internal.R.styleable.Window[i]) + "="
+            for (int i = 0; i < R.styleable.Window.length; i++) {
+                s = s + " " + Integer.toHexString(R.styleable.Window[i]) + "="
                         + a.getString(i);
             }
             System.out.println(s);
         }
 
-        mIsFloating = a.getBoolean(com.android.internal.R.styleable.Window_windowIsFloating, false);
+        mIsFloating = a.getBoolean(R.styleable.Window_windowIsFloating, false);
         int flagsToUpdate = (FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR)
                 & (~getForcedWindowFlags());
         if (mIsFloating) {
@@ -3110,78 +3114,78 @@
             setFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR, flagsToUpdate);
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowNoTitle, false)) {
+        if (a.getBoolean(R.styleable.Window_windowNoTitle, false)) {
             requestFeature(FEATURE_NO_TITLE);
-        } else if (a.getBoolean(com.android.internal.R.styleable.Window_windowActionBar, false)) {
+        } else if (a.getBoolean(R.styleable.Window_windowActionBar, false)) {
             // Don't allow an action bar if there is no title.
             requestFeature(FEATURE_ACTION_BAR);
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowActionBarOverlay, false)) {
+        if (a.getBoolean(R.styleable.Window_windowActionBarOverlay, false)) {
             requestFeature(FEATURE_ACTION_BAR_OVERLAY);
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowActionModeOverlay, false)) {
+        if (a.getBoolean(R.styleable.Window_windowActionModeOverlay, false)) {
             requestFeature(FEATURE_ACTION_MODE_OVERLAY);
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowSwipeToDismiss, false)) {
+        if (a.getBoolean(R.styleable.Window_windowSwipeToDismiss, false)) {
             requestFeature(FEATURE_SWIPE_TO_DISMISS);
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowFullscreen, false)) {
+        if (a.getBoolean(R.styleable.Window_windowFullscreen, false)) {
             setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN & (~getForcedWindowFlags()));
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentStatus,
+        if (a.getBoolean(R.styleable.Window_windowTranslucentStatus,
                 false)) {
             setFlags(FLAG_TRANSLUCENT_STATUS, FLAG_TRANSLUCENT_STATUS
                     & (~getForcedWindowFlags()));
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowTranslucentNavigation,
+        if (a.getBoolean(R.styleable.Window_windowTranslucentNavigation,
                 false)) {
             setFlags(FLAG_TRANSLUCENT_NAVIGATION, FLAG_TRANSLUCENT_NAVIGATION
                     & (~getForcedWindowFlags()));
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowOverscan, false)) {
+        if (a.getBoolean(R.styleable.Window_windowOverscan, false)) {
             setFlags(FLAG_LAYOUT_IN_OVERSCAN, FLAG_LAYOUT_IN_OVERSCAN&(~getForcedWindowFlags()));
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowShowWallpaper, false)) {
+        if (a.getBoolean(R.styleable.Window_windowShowWallpaper, false)) {
             setFlags(FLAG_SHOW_WALLPAPER, FLAG_SHOW_WALLPAPER&(~getForcedWindowFlags()));
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowEnableSplitTouch,
+        if (a.getBoolean(R.styleable.Window_windowEnableSplitTouch,
                 getContext().getApplicationInfo().targetSdkVersion
                         >= android.os.Build.VERSION_CODES.HONEYCOMB)) {
             setFlags(FLAG_SPLIT_TOUCH, FLAG_SPLIT_TOUCH&(~getForcedWindowFlags()));
         }
 
-        a.getValue(com.android.internal.R.styleable.Window_windowMinWidthMajor, mMinWidthMajor);
-        a.getValue(com.android.internal.R.styleable.Window_windowMinWidthMinor, mMinWidthMinor);
-        if (a.hasValue(com.android.internal.R.styleable.Window_windowFixedWidthMajor)) {
+        a.getValue(R.styleable.Window_windowMinWidthMajor, mMinWidthMajor);
+        a.getValue(R.styleable.Window_windowMinWidthMinor, mMinWidthMinor);
+        if (a.hasValue(R.styleable.Window_windowFixedWidthMajor)) {
             if (mFixedWidthMajor == null) mFixedWidthMajor = new TypedValue();
-            a.getValue(com.android.internal.R.styleable.Window_windowFixedWidthMajor,
+            a.getValue(R.styleable.Window_windowFixedWidthMajor,
                     mFixedWidthMajor);
         }
-        if (a.hasValue(com.android.internal.R.styleable.Window_windowFixedWidthMinor)) {
+        if (a.hasValue(R.styleable.Window_windowFixedWidthMinor)) {
             if (mFixedWidthMinor == null) mFixedWidthMinor = new TypedValue();
-            a.getValue(com.android.internal.R.styleable.Window_windowFixedWidthMinor,
+            a.getValue(R.styleable.Window_windowFixedWidthMinor,
                     mFixedWidthMinor);
         }
-        if (a.hasValue(com.android.internal.R.styleable.Window_windowFixedHeightMajor)) {
+        if (a.hasValue(R.styleable.Window_windowFixedHeightMajor)) {
             if (mFixedHeightMajor == null) mFixedHeightMajor = new TypedValue();
-            a.getValue(com.android.internal.R.styleable.Window_windowFixedHeightMajor,
+            a.getValue(R.styleable.Window_windowFixedHeightMajor,
                     mFixedHeightMajor);
         }
-        if (a.hasValue(com.android.internal.R.styleable.Window_windowFixedHeightMinor)) {
+        if (a.hasValue(R.styleable.Window_windowFixedHeightMinor)) {
             if (mFixedHeightMinor == null) mFixedHeightMinor = new TypedValue();
-            a.getValue(com.android.internal.R.styleable.Window_windowFixedHeightMinor,
+            a.getValue(R.styleable.Window_windowFixedHeightMinor,
                     mFixedHeightMinor);
         }
-        if (a.getBoolean(com.android.internal.R.styleable.Window_windowContentTransitions, false)) {
+        if (a.getBoolean(R.styleable.Window_windowContentTransitions, false)) {
             requestFeature(FEATURE_CONTENT_TRANSITIONS);
         }
 
@@ -3190,9 +3194,9 @@
         if (windowService != null) {
             final Display display = windowService.getDefaultDisplay();
             if (display.getDisplayId() == Display.DEFAULT_DISPLAY &&
-                    a.hasValue(com.android.internal.R.styleable.Window_windowOutsetBottom)) {
+                    a.hasValue(R.styleable.Window_windowOutsetBottom)) {
                 if (mOutsetBottom == null) mOutsetBottom = new TypedValue();
-                a.getValue(com.android.internal.R.styleable.Window_windowOutsetBottom,
+                a.getValue(R.styleable.Window_windowOutsetBottom,
                         mOutsetBottom);
             }
         }
@@ -3203,7 +3207,7 @@
         final boolean targetPreIcs = targetSdk < android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH;
         final boolean targetPreL = targetSdk < android.os.Build.VERSION_CODES.L;
         final boolean targetHcNeedsOptions = context.getResources().getBoolean(
-                com.android.internal.R.bool.target_honeycomb_needs_options_menu);
+                R.bool.target_honeycomb_needs_options_menu);
         final boolean noActionBar = !hasFeature(FEATURE_ACTION_BAR) || hasFeature(FEATURE_NO_TITLE);
 
         if (targetPreHoneycomb || (targetPreIcs && targetHcNeedsOptions && noActionBar)) {
@@ -3216,7 +3220,7 @@
         // therefore must know about visibility changes of those.
         if (!mIsFloating && ActivityManager.isHighEndGfx()) {
             if (!targetPreL && a.getBoolean(
-                    com.android.internal.R.styleable.Window_windowDrawsSystemBarBackgrounds,
+                    R.styleable.Window_windowDrawsSystemBarBackgrounds,
                     false)) {
                 setFlags(FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                         FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS & ~getForcedWindowFlags());
@@ -3233,7 +3237,7 @@
         if (mAlwaysReadCloseOnTouchAttr || getContext().getApplicationInfo().targetSdkVersion
                 >= android.os.Build.VERSION_CODES.HONEYCOMB) {
             if (a.getBoolean(
-                    com.android.internal.R.styleable.Window_windowCloseOnTouchOutside,
+                    R.styleable.Window_windowCloseOnTouchOutside,
                     false)) {
                 setCloseOnTouchOutsideIfNotSet(true);
             }
@@ -3243,11 +3247,11 @@
 
         if (!hasSoftInputMode()) {
             params.softInputMode = a.getInt(
-                    com.android.internal.R.styleable.Window_windowSoftInputMode,
+                    R.styleable.Window_windowSoftInputMode,
                     params.softInputMode);
         }
 
-        if (a.getBoolean(com.android.internal.R.styleable.Window_backgroundDimEnabled,
+        if (a.getBoolean(R.styleable.Window_backgroundDimEnabled,
                 mIsFloating)) {
             /* All dialogs should have the window dimmed */
             if ((getForcedWindowFlags()&WindowManager.LayoutParams.FLAG_DIM_BEHIND) == 0) {
@@ -3261,7 +3265,7 @@
 
         if (params.windowAnimations == 0) {
             params.windowAnimations = a.getResourceId(
-                    com.android.internal.R.styleable.Window_windowAnimationStyle, 0);
+                    R.styleable.Window_windowAnimationStyle, 0);
         }
 
         // The rest are only done if this window is not embedded; otherwise,
@@ -3270,10 +3274,10 @@
             if (mBackgroundDrawable == null) {
                 if (mBackgroundResource == 0) {
                     mBackgroundResource = a.getResourceId(
-                            com.android.internal.R.styleable.Window_windowBackground, 0);
+                            R.styleable.Window_windowBackground, 0);
                 }
                 if (mFrameResource == 0) {
-                    mFrameResource = a.getResourceId(com.android.internal.R.styleable.Window_windowFrame, 0);
+                    mFrameResource = a.getResourceId(R.styleable.Window_windowFrame, 0);
                 }
                 if (false) {
                     System.out.println("Background: "
@@ -3281,8 +3285,9 @@
                             + Integer.toHexString(mFrameResource));
                 }
             }
-            mElevation = a.getDimension(com.android.internal.R.styleable.Window_windowElevation, 0);
-            mTextColor = a.getColor(com.android.internal.R.styleable.Window_textColor, 0xFF000000);
+            mElevation = a.getDimension(R.styleable.Window_windowElevation, 0);
+            mClipToOutline = a.getBoolean(R.styleable.Window_windowClipToOutline, false);
+            mTextColor = a.getColor(R.styleable.Window_textColor, Color.TRANSPARENT);
         }
 
         // Inflate the window decor.
@@ -3291,15 +3296,15 @@
         int features = getLocalFeatures();
         // System.out.println("Features: 0x" + Integer.toHexString(features));
         if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) {
-            layoutResource = com.android.internal.R.layout.screen_swipe_dismiss;
+            layoutResource = R.layout.screen_swipe_dismiss;
         } else if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) {
             if (mIsFloating) {
                 TypedValue res = new TypedValue();
                 getContext().getTheme().resolveAttribute(
-                        com.android.internal.R.attr.dialogTitleIconsDecorLayout, res, true);
+                        R.attr.dialogTitleIconsDecorLayout, res, true);
                 layoutResource = res.resourceId;
             } else {
-                layoutResource = com.android.internal.R.layout.screen_title_icons;
+                layoutResource = R.layout.screen_title_icons;
             }
             // XXX Remove this once action bar supports these features.
             removeFeature(FEATURE_ACTION_BAR);
@@ -3308,7 +3313,7 @@
                 && (features & (1 << FEATURE_ACTION_BAR)) == 0) {
             // Special case for a window with only a progress bar (and title).
             // XXX Need to have a no-title version of embedded windows.
-            layoutResource = com.android.internal.R.layout.screen_progress;
+            layoutResource = R.layout.screen_progress;
             // System.out.println("Progress!");
         } else if ((features & (1 << FEATURE_CUSTOM_TITLE)) != 0) {
             // Special case for a window with a custom title.
@@ -3316,10 +3321,10 @@
             if (mIsFloating) {
                 TypedValue res = new TypedValue();
                 getContext().getTheme().resolveAttribute(
-                        com.android.internal.R.attr.dialogCustomTitleDecorLayout, res, true);
+                        R.attr.dialogCustomTitleDecorLayout, res, true);
                 layoutResource = res.resourceId;
             } else {
-                layoutResource = com.android.internal.R.layout.screen_custom_title;
+                layoutResource = R.layout.screen_custom_title;
             }
             // XXX Remove this once action bar supports these features.
             removeFeature(FEATURE_ACTION_BAR);
@@ -3329,21 +3334,21 @@
             if (mIsFloating) {
                 TypedValue res = new TypedValue();
                 getContext().getTheme().resolveAttribute(
-                        com.android.internal.R.attr.dialogTitleDecorLayout, res, true);
+                        R.attr.dialogTitleDecorLayout, res, true);
                 layoutResource = res.resourceId;
             } else if ((features & (1 << FEATURE_ACTION_BAR)) != 0) {
                 layoutResource = a.getResourceId(
-                        com.android.internal.R.styleable.Window_windowActionBarFullscreenDecorLayout,
-                        com.android.internal.R.layout.screen_action_bar);
+                        R.styleable.Window_windowActionBarFullscreenDecorLayout,
+                        R.layout.screen_action_bar);
             } else {
-                layoutResource = com.android.internal.R.layout.screen_title;
+                layoutResource = R.layout.screen_title;
             }
             // System.out.println("Title!");
         } else if ((features & (1 << FEATURE_ACTION_MODE_OVERLAY)) != 0) {
-            layoutResource = com.android.internal.R.layout.screen_simple_overlay_action_mode;
+            layoutResource = R.layout.screen_simple_overlay_action_mode;
         } else {
             // Embedded, so no decoration is needed.
-            layoutResource = com.android.internal.R.layout.screen_simple;
+            layoutResource = R.layout.screen_simple;
             // System.out.println("Simple!");
         }
 
@@ -3379,8 +3384,9 @@
             }
             mDecor.setWindowBackground(background);
 
-            // By default, clip content to the background outline.
-            mDecor.setClipToOutline(true);
+            if (background != null) {
+                mDecor.setClipToOutline(mClipToOutline);
+            }
 
             final Drawable frame;
             if (mFrameResource != 0) {
@@ -3428,7 +3434,7 @@
             mDecor.makeOptionalFitsSystemWindows();
 
             final DecorContentParent decorContentParent = (DecorContentParent) mDecor.findViewById(
-                    com.android.internal.R.id.decor_content_parent);
+                    R.id.decor_content_parent);
 
             if (decorContentParent != null) {
                 mDecorContentParent = decorContentParent;
@@ -3472,12 +3478,12 @@
                     }
                 });
             } else {
-                mTitleView = (TextView)findViewById(com.android.internal.R.id.title);
+                mTitleView = (TextView)findViewById(R.id.title);
                 if (mTitleView != null) {
                     mTitleView.setLayoutDirection(mDecor.getLayoutDirection());
                     if ((getLocalFeatures() & (1 << FEATURE_NO_TITLE)) != 0) {
                         View titleContainer = findViewById(
-                                com.android.internal.R.id.title_container);
+                                R.id.title_container);
                         if (titleContainer != null) {
                             titleContainer.setVisibility(View.GONE);
                         } else {
@@ -3497,7 +3503,7 @@
             if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
                 if (mTransitionManager == null) {
                     final int transitionRes = getWindowStyle().getResourceId(
-                            com.android.internal.R.styleable.Window_windowContentTransitionManager,
+                            R.styleable.Window_windowContentTransitionManager,
                             0);
                     if (transitionRes != 0) {
                         final TransitionInflater inflater = TransitionInflater.from(getContext());
@@ -3509,26 +3515,26 @@
                 }
 
                 mEnterTransition = getTransition(mEnterTransition,
-                        com.android.internal.R.styleable.Window_windowEnterTransition);
+                        R.styleable.Window_windowEnterTransition);
                 mExitTransition = getTransition(mExitTransition,
-                        com.android.internal.R.styleable.Window_windowExitTransition);
+                        R.styleable.Window_windowExitTransition);
                 mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition,
-                        com.android.internal.R.styleable.Window_windowSharedElementEnterTransition);
+                        R.styleable.Window_windowSharedElementEnterTransition);
                 mSharedElementExitTransition = getTransition(mSharedElementExitTransition,
-                        com.android.internal.R.styleable.Window_windowSharedElementExitTransition);
+                        R.styleable.Window_windowSharedElementExitTransition);
                 if (mAllowEnterTransitionOverlap == null) {
                     mAllowEnterTransitionOverlap = getWindowStyle().getBoolean(
-                            com.android.internal.R.styleable.
+                            R.styleable.
                                     Window_windowAllowEnterTransitionOverlap, true);
                 }
                 if (mAllowExitTransitionOverlap == null) {
                     mAllowExitTransitionOverlap = getWindowStyle().getBoolean(
-                            com.android.internal.R.styleable.
+                            R.styleable.
                                     Window_windowAllowExitTransitionOverlap, true);
                 }
                 if (mBackgroundFadeDurationMillis < 0) {
                     mBackgroundFadeDurationMillis = getWindowStyle().getInteger(
-                            com.android.internal.R.styleable.
+                            R.styleable.
                                     Window_windowTransitionBackgroundFadeDuration,
                             DEFAULT_BACKGROUND_FADE_DURATION_MS);
                 }
@@ -3542,7 +3548,7 @@
         }
         int transitionId = getWindowStyle().getResourceId(id, -1);
         Transition transition = null;
-        if (transitionId != -1 && transitionId != com.android.internal.R.transition.no_transition) {
+        if (transitionId != -1 && transitionId != R.transition.no_transition) {
             TransitionInflater inflater = TransitionInflater.from(getContext());
             transition = inflater.inflateTransition(transitionId);
         }
@@ -3716,7 +3722,7 @@
         if (mContentParent == null) {
             installDecor();
         }
-        return (mLeftIconView = (ImageView)findViewById(com.android.internal.R.id.left_icon));
+        return (mLeftIconView = (ImageView)findViewById(R.id.left_icon));
     }
 
     @Override
@@ -3734,7 +3740,7 @@
         if (mContentParent == null && shouldInstallDecor) {
             installDecor();
         }
-        mCircularProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress_circular);
+        mCircularProgressBar = (ProgressBar) findViewById(R.id.progress_circular);
         if (mCircularProgressBar != null) {
             mCircularProgressBar.setVisibility(View.INVISIBLE);
         }
@@ -3748,7 +3754,7 @@
         if (mContentParent == null && shouldInstallDecor) {
             installDecor();
         }
-        mHorizontalProgressBar = (ProgressBar) findViewById(com.android.internal.R.id.progress_horizontal);
+        mHorizontalProgressBar = (ProgressBar) findViewById(R.id.progress_horizontal);
         if (mHorizontalProgressBar != null) {
             mHorizontalProgressBar.setVisibility(View.INVISIBLE);
         }
@@ -3762,12 +3768,12 @@
         if (mContentParent == null) {
             installDecor();
         }
-        return (mRightIconView = (ImageView)findViewById(com.android.internal.R.id.right_icon));
+        return (mRightIconView = (ImageView)findViewById(R.id.right_icon));
     }
 
     private void registerSwipeCallbacks() {
         SwipeDismissLayout swipeDismiss =
-                (SwipeDismissLayout) findViewById(com.android.internal.R.id.content);
+                (SwipeDismissLayout) findViewById(R.id.content);
         swipeDismiss.setOnDismissedListener(new SwipeDismissLayout.OnDismissedListener() {
             @Override
             public void onDismissed(SwipeDismissLayout layout) {
@@ -3885,7 +3891,7 @@
     private boolean isTranslucent() {
         TypedArray a = getWindowStyle();
         return a.getBoolean(a.getResourceId(
-                com.android.internal.R.styleable.Window_windowIsTranslucent, 0), false);
+                R.styleable.Window_windowIsTranslucent, 0), false);
     }
 
     @Override
@@ -4103,18 +4109,18 @@
         }
 
         void setStyle(Context context) {
-            TypedArray a = context.obtainStyledAttributes(com.android.internal.R.styleable.Theme);
+            TypedArray a = context.obtainStyledAttributes(R.styleable.Theme);
             background = a.getResourceId(
-                    com.android.internal.R.styleable.Theme_panelBackground, 0);
+                    R.styleable.Theme_panelBackground, 0);
             fullBackground = a.getResourceId(
-                    com.android.internal.R.styleable.Theme_panelFullBackground, 0);
+                    R.styleable.Theme_panelFullBackground, 0);
             windowAnimations = a.getResourceId(
-                    com.android.internal.R.styleable.Theme_windowAnimationStyle, 0);
+                    R.styleable.Theme_windowAnimationStyle, 0);
             isCompact = a.getBoolean(
-                    com.android.internal.R.styleable.Theme_panelMenuIsCompact, false);
+                    R.styleable.Theme_panelMenuIsCompact, false);
             listPresenterTheme = a.getResourceId(
-                    com.android.internal.R.styleable.Theme_panelMenuListTheme,
-                    com.android.internal.R.style.Theme_ExpandedMenu);
+                    R.styleable.Theme_panelMenuListTheme,
+                    R.style.Theme_ExpandedMenu);
             a.recycle();
         }
 
@@ -4141,9 +4147,9 @@
 
             if (listMenuPresenter == null) {
                 listMenuPresenter = new ListMenuPresenter(
-                        com.android.internal.R.layout.list_menu_item_layout, listPresenterTheme);
+                        R.layout.list_menu_item_layout, listPresenterTheme);
                 listMenuPresenter.setCallback(cb);
-                listMenuPresenter.setId(com.android.internal.R.id.list_menu_presenter);
+                listMenuPresenter.setId(R.id.list_menu_presenter);
                 menu.addMenuPresenter(listMenuPresenter);
             }
 
@@ -4162,7 +4168,7 @@
             if (iconMenuPresenter == null) {
                 iconMenuPresenter = new IconMenuPresenter(context);
                 iconMenuPresenter.setCallback(cb);
-                iconMenuPresenter.setId(com.android.internal.R.id.icon_menu_presenter);
+                iconMenuPresenter.setId(R.id.icon_menu_presenter);
                 menu.addMenuPresenter(iconMenuPresenter);
             }
 
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 44a5344..324f536 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -5401,7 +5401,7 @@
         }
         final boolean hapticsDisabled = Settings.System.getIntForUser(mContext.getContentResolver(),
                 Settings.System.HAPTIC_FEEDBACK_ENABLED, 0, UserHandle.USER_CURRENT) == 0;
-        if (!always && (hapticsDisabled || mKeyguardDelegate.isShowingAndNotOccluded())) {
+        if (hapticsDisabled && !always) {
             return false;
         }
         long[] pattern = null;
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 595e91e..291d366 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -34,6 +34,7 @@
 import android.app.backup.IFullBackupRestoreObserver;
 import android.app.backup.IRestoreObserver;
 import android.app.backup.IRestoreSession;
+import android.app.job.JobParameters;
 import android.content.ActivityNotFoundException;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -78,6 +79,7 @@
 import android.provider.Settings;
 import android.system.ErrnoException;
 import android.system.Os;
+import android.util.AtomicFile;
 import android.util.EventLog;
 import android.util.Log;
 import android.util.Slog;
@@ -119,6 +121,7 @@
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -154,6 +157,7 @@
     private static final String TAG = "BackupManagerService";
     private static final boolean DEBUG = true;
     private static final boolean MORE_DEBUG = false;
+    private static final boolean DEBUG_SCHEDULING = MORE_DEBUG || true;
 
     // System-private key used for backing up an app's widget state.  Must
     // begin with U+FFxx by convention (we reserve all keys starting
@@ -239,7 +243,10 @@
     // order to give them time to enter the backup password.
     static final long TIMEOUT_FULL_CONFIRMATION = 60 * 1000;
 
-    private Context mContext;
+    // How long between attempts to perform a full-data backup of any given app
+    static final long MIN_FULL_BACKUP_INTERVAL = 1000 * 60 * 60 * 24; // one day
+
+    Context mContext;
     private PackageManager mPackageManager;
     IPackageManager mPackageManagerBinder;
     private IActivityManager mActivityManager;
@@ -313,17 +320,32 @@
     // Watch the device provisioning operation during setup
     ContentObserver mProvisionedObserver;
 
+    static BackupManagerService sInstance;
+    static BackupManagerService getInstance() {
+        // Always constructed during system bringup, so no need to lazy-init
+        return sInstance;
+    }
+
     public static final class Lifecycle extends SystemService {
-        private final BackupManagerService mService;
 
         public Lifecycle(Context context) {
             super(context);
-            mService = new BackupManagerService(context);
+            sInstance = new BackupManagerService(context);
         }
 
         @Override
         public void onStart() {
-            publishBinderService(Context.BACKUP_SERVICE, mService);
+            publishBinderService(Context.BACKUP_SERVICE, sInstance);
+        }
+
+        @Override
+        public void onBootPhase(int phase) {
+            if (phase == PHASE_THIRD_PARTY_APPS_CAN_START) {
+                ContentResolver r = sInstance.mContext.getContentResolver();
+                boolean areEnabled = Settings.Secure.getInt(r,
+                        Settings.Secure.BACKUP_ENABLED, 0) != 0;
+                sInstance.setBackupEnabled(areEnabled);
+            }
         }
     }
 
@@ -542,6 +564,30 @@
     static final String INIT_SENTINEL_FILE_NAME = "_need_init_";
     HashSet<String> mPendingInits = new HashSet<String>();  // transport names
 
+    // Round-robin queue for scheduling full backup passes
+    static final int SCHEDULE_FILE_VERSION = 1; // current version of the schedule file
+    class FullBackupEntry implements Comparable<FullBackupEntry> {
+        String packageName;
+        long lastBackup;
+
+        FullBackupEntry(String pkg, long when) {
+            packageName = pkg;
+            lastBackup = when;
+        }
+
+        @Override
+        public int compareTo(FullBackupEntry other) {
+            if (lastBackup < other.lastBackup) return -1;
+            else if (lastBackup > other.lastBackup) return 1;
+            else return 0;
+        }
+    }
+
+    File mFullBackupScheduleFile;
+    // If we're running a schedule-driven full backup, this is the task instance doing it
+    PerformFullTransportBackupTask mRunningFullBackupTask; // inside mQueueLock
+    ArrayList<FullBackupEntry> mFullBackupQueue;           // inside mQueueLock
+
     // Utility: build a new random integer token
     int generateToken() {
         int token;
@@ -573,6 +619,17 @@
         return true;
     }
 
+    /* does *not* check overall backup eligibility policy! */
+    public static boolean appGetsFullBackup(PackageInfo pkg) {
+        if (pkg.applicationInfo.backupAgentName != null) {
+            // If it has an agent, it gets full backups only if it says so
+            return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_FULL_BACKUP_ONLY) != 0;
+        }
+
+        // No agent means we do full backups for it
+        return true;
+    }
+
     // ----- Asynchronous backup/restore handler thread -----
 
     private class BackupHandler extends Handler {
@@ -892,8 +949,6 @@
 
         // Set up our bookkeeping
         final ContentResolver resolver = context.getContentResolver();
-        boolean areEnabled = Settings.Secure.getInt(resolver,
-                Settings.Secure.BACKUP_ENABLED, 0) != 0;
         mProvisioned = Settings.Global.getInt(resolver,
                 Settings.Global.DEVICE_PROVISIONED, 0) != 0;
         mAutoRestore = Settings.Secure.getInt(resolver,
@@ -987,6 +1042,7 @@
         mJournal = null;        // will be created on first use
 
         // Set up the various sorts of package tracking we do
+        mFullBackupScheduleFile = new File(mBaseStateDir, "fb-schedule");
         initPackageTracking();
 
         // Build our mapping of uid to backup client services.  This implicitly
@@ -1050,9 +1106,6 @@
 
         // Power management
         mWakelock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*");
-
-        // Start the backup passes going
-        setBackupEnabled(areEnabled);
     }
 
     private class RunBackupReceiver extends BroadcastReceiver {
@@ -1192,6 +1245,9 @@
             }
         }
 
+        // Resume the full-data backup queue
+        mFullBackupQueue = readFullBackupSchedule();
+
         // Register for broadcasts about package install, etc., so we can
         // update the provider list.
         IntentFilter filter = new IntentFilter();
@@ -1206,6 +1262,96 @@
         mContext.registerReceiver(mBroadcastReceiver, sdFilter);
     }
 
+    private ArrayList<FullBackupEntry> readFullBackupSchedule() {
+        ArrayList<FullBackupEntry> schedule = null;
+        synchronized (mQueueLock) {
+            if (mFullBackupScheduleFile.exists()) {
+                try {
+                    FileInputStream fstream = new FileInputStream(mFullBackupScheduleFile);
+                    BufferedInputStream bufStream = new BufferedInputStream(fstream);
+                    DataInputStream in = new DataInputStream(bufStream);
+
+                    int version = in.readInt();
+                    if (version != SCHEDULE_FILE_VERSION) {
+                        Slog.e(TAG, "Unknown backup schedule version " + version);
+                        return null;
+                    }
+
+                    int N = in.readInt();
+                    schedule = new ArrayList<FullBackupEntry>(N);
+                    for (int i = 0; i < N; i++) {
+                        String pkgName = in.readUTF();
+                        long lastBackup = in.readLong();
+                        schedule.add(new FullBackupEntry(pkgName, lastBackup));
+                    }
+                    Collections.sort(schedule);
+                } catch (Exception e) {
+                    Slog.e(TAG, "Unable to read backup schedule", e);
+                    mFullBackupScheduleFile.delete();
+                    schedule = null;
+                }
+            }
+
+            if (schedule == null) {
+                // no prior queue record, or unable to read it.  Set up the queue
+                // from scratch.
+                List<PackageInfo> apps =
+                        PackageManagerBackupAgent.getStorableApplications(mPackageManager);
+                final int N = apps.size();
+                schedule = new ArrayList<FullBackupEntry>(N);
+                for (int i = 0; i < N; i++) {
+                    PackageInfo info = apps.get(i);
+                    if (appGetsFullBackup(info)) {
+                        schedule.add(new FullBackupEntry(info.packageName, 0));
+                    }
+                }
+                writeFullBackupScheduleAsync();
+            }
+        }
+        return schedule;
+    }
+
+    Runnable mFullBackupScheduleWriter = new Runnable() {
+        @Override public void run() {
+            synchronized (mQueueLock) {
+                try {
+                    ByteArrayOutputStream bufStream = new ByteArrayOutputStream(4096);
+                    DataOutputStream bufOut = new DataOutputStream(bufStream);
+                    bufOut.writeInt(SCHEDULE_FILE_VERSION);
+
+                    // version 1:
+                    //
+                    // [int] # of packages in the queue = N
+                    // N * {
+                    //     [utf8] package name
+                    //     [long] last backup time for this package
+                    //     }
+                    int N = mFullBackupQueue.size();
+                    bufOut.writeInt(N);
+
+                    for (int i = 0; i < N; i++) {
+                        FullBackupEntry entry = mFullBackupQueue.get(i);
+                        bufOut.writeUTF(entry.packageName);
+                        bufOut.writeLong(entry.lastBackup);
+                    }
+                    bufOut.flush();
+
+                    AtomicFile af = new AtomicFile(mFullBackupScheduleFile);
+                    FileOutputStream out = af.startWrite();
+                    out.write(bufStream.toByteArray());
+                    af.finishWrite(out);
+                } catch (Exception e) {
+                    Slog.e(TAG, "Unable to write backup schedule!", e);
+                }
+            }
+        }
+    };
+
+    private void writeFullBackupScheduleAsync() {
+        mBackupHandler.removeCallbacks(mFullBackupScheduleWriter);
+        mBackupHandler.post(mFullBackupScheduleWriter);
+    }
+
     private void parseLeftoverJournals() {
         for (File f : mJournalDir.listFiles()) {
             if (mJournal == null || f.compareTo(mJournal) != 0) {
@@ -1633,6 +1779,22 @@
                     }
                     addPackageParticipantsLocked(pkgList);
                 }
+                // If they're full-backup candidates, add them there instead
+                for (String packageName : pkgList) {
+                    try {
+                        PackageInfo app = mPackageManager.getPackageInfo(packageName, 0);
+                        long now = System.currentTimeMillis();
+                        if (appGetsFullBackup(app)) {
+                            enqueueFullBackup(packageName, now);
+                            scheduleNextFullBackupJob();
+                        }
+                    } catch (NameNotFoundException e) {
+                        // doesn't really exist; ignore it
+                        if (DEBUG) {
+                            Slog.i(TAG, "Can't resolve new app " + packageName);
+                        }
+                    }
+                }
             } else {
                 if (replacing) {
                     // The package is being updated.  We'll receive a PACKAGE_ADDED shortly.
@@ -3437,12 +3599,19 @@
     class PerformFullTransportBackupTask extends FullBackupTask {
         static final String TAG = "PFTBT";
         ArrayList<PackageInfo> mPackages;
+        boolean mUpdateSchedule;
         AtomicBoolean mLatch;
+        AtomicBoolean mKeepRunning;     // signal from job scheduler
+        FullBackupJob mJob;             // if a scheduled job needs to be finished afterwards
 
         PerformFullTransportBackupTask(IFullBackupRestoreObserver observer, 
-                String[] whichPackages, AtomicBoolean latch) {
+                String[] whichPackages, boolean updateSchedule,
+                FullBackupJob runningJob, AtomicBoolean latch) {
             super(observer);
+            mUpdateSchedule = updateSchedule;
             mLatch = latch;
+            mKeepRunning = new AtomicBoolean(true);
+            mJob = runningJob;
             mPackages = new ArrayList<PackageInfo>(whichPackages.length);
 
             for (String pkg : whichPackages) {
@@ -3474,119 +3643,164 @@
             }
         }
 
+        public void setRunning(boolean running) {
+            mKeepRunning.set(running);
+        }
+
         @Override
         public void run() {
-            IBackupTransport transport = getTransport(mCurrentTransport);
-            if (transport == null) {
-                Slog.w(TAG, "Transport not present; full data backup not performed");
-                return;
-            }
-
             // data from the app, passed to us for bridging to the transport
             ParcelFileDescriptor[] enginePipes = null;
 
             // Pipe through which we write data to the transport
             ParcelFileDescriptor[] transportPipes = null;
 
+            PackageInfo currentPackage;
+
             try {
+                IBackupTransport transport = getTransport(mCurrentTransport);
+                if (transport == null) {
+                    Slog.w(TAG, "Transport not present; full data backup not performed");
+                    return;
+                }
+
                 // Set up to send data to the transport
-                if (transport != null) {
-                    for (PackageInfo target : mPackages) {
-                        if (DEBUG) {
-                            Slog.i(TAG, "Initiating full-data transport backup of "
-                                    + target.packageName);
-                        }
-                        transportPipes = ParcelFileDescriptor.createPipe();
-
-                        // Tell the transport the data's coming
-                        int result = transport.performFullBackup(target, transportPipes[0]);
-                        if (result == BackupTransport.TRANSPORT_OK) {
-                            // The transport has its own copy of the read end of the pipe,
-                            // so close ours now
-                            transportPipes[0].close();
-                            transportPipes[0] = null;
-
-                            // Now set up the backup engine / data source end of things
-                            enginePipes = ParcelFileDescriptor.createPipe();
-                            AtomicBoolean runnerLatch = new AtomicBoolean(false);
-                            SinglePackageBackupRunner backupRunner =
-                                    new SinglePackageBackupRunner(enginePipes[1], target,
-                                            runnerLatch);
-                            // The runner dup'd the pipe half, so we close it here
-                            enginePipes[1].close();
-                            enginePipes[1] = null;
-
-                            // Spin off the runner to fetch the app's data and pipe it
-                            // into the engine pipes
-                            (new Thread(backupRunner, "package-backup-bridge")).start();
-
-                            // Read data off the engine pipe and pass it to the transport
-                            // pipe until we hit EOD on the input stream.
-                            FileInputStream in = new FileInputStream(
-                                    enginePipes[0].getFileDescriptor());
-                            FileOutputStream out = new FileOutputStream(
-                                    transportPipes[1].getFileDescriptor());
-                            byte[] buffer = new byte[8192];
-                            int nRead = 0;
-                            do {
-                                nRead = in.read(buffer);
-                                if (nRead > 0) {
-                                    out.write(buffer, 0, nRead);
-                                    result = transport.sendBackupData(nRead);
-                                }
-                            } while (nRead > 0 && result == BackupTransport.TRANSPORT_OK);
-
-                            // In all cases we need to give the transport its finish callback
-                            int finishResult = transport.finishBackup();
-
-                            if (MORE_DEBUG) {
-                                Slog.i(TAG, "Done trying to send backup data: result="
-                                        + result + " finishResult=" + finishResult);
-                            }
-
-                            // If we were otherwise in a good state, now interpret the final
-                            // result based on what finishBackup() returned.  If we're in a
-                            // failure case already, preserve that result and ignore whatever
-                            // finishBackup() reported.
-                            if (result == BackupTransport.TRANSPORT_OK) {
-                                result = finishResult;
-                            }
-
-                            if (result != BackupTransport.TRANSPORT_OK) {
-                                Slog.e(TAG, "Error " + result
-                                        + " backing up " + target.packageName);
-                            }
-                        }
-
-                        if (result == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
-                            if (DEBUG) {
-                                Slog.i(TAG, "Transport rejected backup of " + target.packageName
-                                        + ", skipping");
-                            }
-                            // do nothing, clean up, and continue looping
-                        } else if (result != BackupTransport.TRANSPORT_OK) {
-                            if (DEBUG) {
-                                Slog.i(TAG, "Transport failed; aborting backup: " + result);
-                                return;
-                            }
-                        }
-                        cleanUpPipes(transportPipes);
-                        cleanUpPipes(enginePipes);
-                    }
-
+                final int N = mPackages.size();
+                for (int i = 0; i < N; i++) {
+                    currentPackage = mPackages.get(i);
                     if (DEBUG) {
-                        Slog.i(TAG, "Full backup completed.");
+                        Slog.i(TAG, "Initiating full-data transport backup of "
+                                + currentPackage.packageName);
                     }
+                    transportPipes = ParcelFileDescriptor.createPipe();
+
+                    // Tell the transport the data's coming
+                    int result = transport.performFullBackup(currentPackage,
+                            transportPipes[0]);
+                    if (result == BackupTransport.TRANSPORT_OK) {
+                        // The transport has its own copy of the read end of the pipe,
+                        // so close ours now
+                        transportPipes[0].close();
+                        transportPipes[0] = null;
+
+                        // Now set up the backup engine / data source end of things
+                        enginePipes = ParcelFileDescriptor.createPipe();
+                        AtomicBoolean runnerLatch = new AtomicBoolean(false);
+                        SinglePackageBackupRunner backupRunner =
+                                new SinglePackageBackupRunner(enginePipes[1], currentPackage,
+                                        runnerLatch);
+                        // The runner dup'd the pipe half, so we close it here
+                        enginePipes[1].close();
+                        enginePipes[1] = null;
+
+                        // Spin off the runner to fetch the app's data and pipe it
+                        // into the engine pipes
+                        (new Thread(backupRunner, "package-backup-bridge")).start();
+
+                        // Read data off the engine pipe and pass it to the transport
+                        // pipe until we hit EOD on the input stream.
+                        FileInputStream in = new FileInputStream(
+                                enginePipes[0].getFileDescriptor());
+                        FileOutputStream out = new FileOutputStream(
+                                transportPipes[1].getFileDescriptor());
+                        byte[] buffer = new byte[8192];
+                        int nRead = 0;
+                        do {
+                            if (!mKeepRunning.get()) {
+                                if (DEBUG_SCHEDULING) {
+                                    Slog.i(TAG, "Full backup task told to stop");
+                                }
+                                break;
+                            }
+                            nRead = in.read(buffer);
+                            if (nRead > 0) {
+                                out.write(buffer, 0, nRead);
+                                result = transport.sendBackupData(nRead);
+                            }
+                        } while (nRead > 0 && result == BackupTransport.TRANSPORT_OK);
+
+                        int finishResult;
+
+                        if (!mKeepRunning.get()) {
+                            result = BackupTransport.TRANSPORT_ERROR;
+                            // TODO: tell the transport to abort the backup
+                            Slog.w(TAG, "TODO: tell transport to halt & roll back");
+                        }
+
+                        // In all cases we need to give the transport its finish callback
+                        finishResult = transport.finishBackup();
+
+                        if (MORE_DEBUG) {
+                            Slog.i(TAG, "Done trying to send backup data: result="
+                                    + result + " finishResult=" + finishResult);
+                        }
+
+                        // If we were otherwise in a good state, now interpret the final
+                        // result based on what finishBackup() returned.  If we're in a
+                        // failure case already, preserve that result and ignore whatever
+                        // finishBackup() reported.
+                        if (result == BackupTransport.TRANSPORT_OK) {
+                            result = finishResult;
+                        }
+
+                        if (result != BackupTransport.TRANSPORT_OK) {
+                            Slog.e(TAG, "Error " + result
+                                    + " backing up " + currentPackage.packageName);
+                        }
+                    }
+
+                    // Roll this package to the end of the backup queue if we're
+                    // in a queue-driven mode (regardless of success/failure)
+                    if (mUpdateSchedule) {
+                        enqueueFullBackup(currentPackage.packageName,
+                                System.currentTimeMillis());
+                    }
+
+                    if (result == BackupTransport.TRANSPORT_PACKAGE_REJECTED) {
+                        if (DEBUG) {
+                            Slog.i(TAG, "Transport rejected backup of "
+                                    + currentPackage.packageName
+                                    + ", skipping");
+                        }
+                        // do nothing, clean up, and continue looping
+                    } else if (result != BackupTransport.TRANSPORT_OK) {
+                        if (DEBUG) {
+                            Slog.i(TAG, "Transport failed; aborting backup: " + result);
+                            return;
+                        }
+                    }
+                    cleanUpPipes(transportPipes);
+                    cleanUpPipes(enginePipes);
+                    currentPackage = null;
+                }
+
+                if (DEBUG) {
+                    Slog.i(TAG, "Full backup completed.");
                 }
             } catch (Exception e) {
                 Slog.w(TAG, "Exception trying full transport backup", e);
             } finally {
                 cleanUpPipes(transportPipes);
                 cleanUpPipes(enginePipes);
+
+                if (mJob != null) {
+                    mJob.finishBackupPass();
+                }
+
+                synchronized (mQueueLock) {
+                    mRunningFullBackupTask = null;
+                }
+
                 synchronized (mLatch) {
                     mLatch.set(true);
                     mLatch.notifyAll();
                 }
+
+                // Now that we're actually done with schedule-driven work, reschedule
+                // the next pass based on the new queue state.
+                if (mUpdateSchedule) {
+                    scheduleNextFullBackupJob();
+                }
             }
         }
 
@@ -3653,6 +3867,146 @@
         }
     }
 
+    // ----- Full-data backup scheduling -----
+
+    /**
+     * Schedule a job to tell us when it's a good time to run a full backup
+     */
+    void scheduleNextFullBackupJob() {
+        synchronized (mQueueLock) {
+            if (mFullBackupQueue.size() > 0) {
+                // schedule the next job at the point in the future when the least-recently
+                // backed up app comes due for backup again; or immediately if it's already
+                // due.
+                long upcomingLastBackup = mFullBackupQueue.get(0).lastBackup;
+                long timeSinceLast = System.currentTimeMillis() - upcomingLastBackup;
+                final long latency = (timeSinceLast < MIN_FULL_BACKUP_INTERVAL)
+                        ? (MIN_FULL_BACKUP_INTERVAL - timeSinceLast) : 0;
+                Runnable r = new Runnable() {
+                    @Override public void run() {
+                        FullBackupJob.schedule(mContext, latency);
+                    }
+                };
+                mBackupHandler.postDelayed(r, 2500);
+            } else {
+                if (DEBUG_SCHEDULING) {
+                    Slog.i(TAG, "Full backup queue empty; not scheduling");
+                }
+            }
+        }
+    }
+
+    /**
+     * Enqueue full backup for the given app, with a note about when it last ran.
+     */
+    void enqueueFullBackup(String packageName, long lastBackedUp) {
+        FullBackupEntry newEntry = new FullBackupEntry(packageName, lastBackedUp);
+        synchronized (mQueueLock) {
+            int N = mFullBackupQueue.size();
+            // First, sanity check that we aren't adding a duplicate.  Slow but
+            // straightforward; we'll have at most on the order of a few hundred
+            // items in this list.
+            for (int i = N-1; i >= 0; i--) {
+                final FullBackupEntry e = mFullBackupQueue.get(i);
+                if (packageName.equals(e.packageName)) {
+                    if (DEBUG) {
+                        Slog.w(TAG, "Removing schedule queue dupe of " + packageName);
+                    }
+                    mFullBackupQueue.remove(i);
+                }
+            }
+
+            // This is also slow but easy for modest numbers of apps: work backwards
+            // from the end of the queue until we find an item whose last backup
+            // time was before this one, then insert this new entry after it.
+            int which;
+            for (which = mFullBackupQueue.size() - 1; which >= 0; which--) {
+                final FullBackupEntry entry = mFullBackupQueue.get(which);
+                if (entry.lastBackup <= lastBackedUp) {
+                    mFullBackupQueue.add(which + 1, newEntry);
+                    break;
+                }
+            }
+            if (which < 0) {
+                // this one is earlier than any existing one, so prepend
+                mFullBackupQueue.add(0, newEntry);
+            }
+        }
+        writeFullBackupScheduleAsync();
+    }
+
+    /**
+     * Conditions are right for a full backup operation, so run one.  The model we use is
+     * to perform one app backup per scheduled job execution, and to reschedule the job
+     * with zero latency as long as conditions remain right and we still have work to do.
+     *
+     * @return Whether ongoing work will continue.  The return value here will be passed
+     *         along as the return value to the scheduled job's onStartJob() callback.
+     */
+    boolean beginFullBackup(FullBackupJob scheduledJob) {
+        long now = System.currentTimeMillis();
+        FullBackupEntry entry = null;
+
+        if (DEBUG_SCHEDULING) {
+            Slog.i(TAG, "Beginning scheduled full backup operation");
+        }
+
+        // Great; we're able to run full backup jobs now.  See if we have any work to do.
+        synchronized (mQueueLock) {
+            if (mRunningFullBackupTask != null) {
+                Slog.e(TAG, "Backup triggered but one already/still running!");
+                return false;
+            }
+
+            if (mFullBackupQueue.size() == 0) {
+                // no work to do so just bow out
+                if (DEBUG) {
+                    Slog.i(TAG, "Backup queue empty; doing nothing");
+                }
+                return false;
+            }
+
+            entry = mFullBackupQueue.get(0);
+            long timeSinceRun = now - entry.lastBackup;
+            if (timeSinceRun < MIN_FULL_BACKUP_INTERVAL) {
+                // It's too early to back up the next thing in the queue, so bow out
+                if (MORE_DEBUG) {
+                    Slog.i(TAG, "Device ready but too early to back up next app");
+                }
+                final long latency = MIN_FULL_BACKUP_INTERVAL - timeSinceRun;
+                mBackupHandler.post(new Runnable() {
+                    @Override public void run() {
+                        FullBackupJob.schedule(mContext, latency);
+                    }
+                });
+                return false;
+            }
+
+            // Okay, the top thing is runnable now.  Pop it off and get going.
+            mFullBackupQueue.remove(0);
+            AtomicBoolean latch = new AtomicBoolean(false);
+            String[] pkg = new String[] {entry.packageName};
+            mRunningFullBackupTask = new PerformFullTransportBackupTask(null, pkg, true,
+                    scheduledJob, latch);
+            (new Thread(mRunningFullBackupTask)).start();
+        }
+
+        return true;
+    }
+
+    // The job scheduler says our constraints don't hold any more,
+    // so tear down any ongoing backup task right away.
+    void endFullBackup() {
+        synchronized (mQueueLock) {
+            if (mRunningFullBackupTask != null) {
+                if (DEBUG_SCHEDULING) {
+                    Slog.i(TAG, "Telling running backup to stop");
+                }
+                mRunningFullBackupTask.setRunning(false);
+            }
+        }
+    }
+
     // ----- Restore infrastructure -----
 
     abstract class RestoreEngine {
@@ -7726,7 +8080,8 @@
         }
 
         AtomicBoolean latch = new AtomicBoolean(false);
-        PerformFullTransportBackupTask task = new PerformFullTransportBackupTask(null, pkgNames, latch);
+        PerformFullTransportBackupTask task =
+                new PerformFullTransportBackupTask(null, pkgNames, false, null, latch);
         (new Thread(task, "full-transport-master")).start();
         synchronized (latch) {
             try {
@@ -7915,6 +8270,7 @@
                 if (enable && !wasEnabled && mProvisioned) {
                     // if we've just been enabled, start scheduling backup passes
                     startBackupAlarmsLocked(BACKUP_INTERVAL);
+                    scheduleNextFullBackupJob();
                 } else if (!enable) {
                     // No longer enabled, so stop running backups
                     if (DEBUG) Slog.i(TAG, "Opting out of backup");
@@ -8653,10 +9009,16 @@
                 pw.println("    " + pkg);
             }
 
-            pw.println("Pending backup: " + mPendingBackups.size());
+            pw.println("Pending key/value backup: " + mPendingBackups.size());
             for (BackupRequest req : mPendingBackups.values()) {
                 pw.println("    " + req);
             }
+
+            pw.println("Full backup queue:" + mFullBackupQueue.size());
+            for (FullBackupEntry entry : mFullBackupQueue) {
+                pw.print("    "); pw.print(entry.lastBackup);
+                pw.print(" : "); pw.println(entry.packageName);
+            }
         }
     }
 }
diff --git a/services/backup/java/com/android/server/backup/FullBackupJob.java b/services/backup/java/com/android/server/backup/FullBackupJob.java
new file mode 100644
index 0000000..deb2293
--- /dev/null
+++ b/services/backup/java/com/android/server/backup/FullBackupJob.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2014 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.server.backup;
+
+import android.app.job.JobInfo;
+import android.app.job.JobParameters;
+import android.app.job.JobScheduler;
+import android.app.job.JobService;
+import android.app.job.JobInfo.NetworkType;
+import android.content.ComponentName;
+import android.content.Context;
+import android.util.Slog;
+
+public class FullBackupJob extends JobService {
+    private static final String TAG = "FullBackupJob";
+    private static final boolean DEBUG = true;
+
+    private static ComponentName sIdleService =
+            new ComponentName("android", FullBackupJob.class.getName());
+
+    private static final int JOB_ID = 0x5038;
+
+    JobParameters mParams;
+
+    public static void schedule(Context ctx, long minDelay) {
+        JobScheduler js = (JobScheduler) ctx.getSystemService(Context.JOB_SCHEDULER_SERVICE);
+        JobInfo.Builder builder = new JobInfo.Builder(JOB_ID, sIdleService)
+                .setRequiresDeviceIdle(true)
+                .setRequiredNetworkCapabilities(NetworkType.UNMETERED)
+                .setRequiresCharging(true);
+        if (minDelay > 0) {
+            builder.setMinimumLatency(minDelay);
+        }
+        js.schedule(builder.build());
+    }
+
+    // callback from the Backup Manager Service: it's finished its work for this pass
+    public void finishBackupPass() {
+        if (mParams != null) {
+            jobFinished(mParams, false);
+            mParams = null;
+        }
+    }
+
+    // ----- scheduled job interface -----
+
+    @Override
+    public boolean onStartJob(JobParameters params) {
+        mParams = params;
+        BackupManagerService service = BackupManagerService.getInstance();
+        return service.beginFullBackup(this);
+    }
+
+    @Override
+    public boolean onStopJob(JobParameters params) {
+        if (mParams != null) {
+            mParams = null;
+            BackupManagerService service = BackupManagerService.getInstance();
+            service.endFullBackup();
+        }
+        return false;
+    }
+
+}
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index 5a510a9..13e1b37 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -96,8 +96,6 @@
     final SparseArray<HashMap<String, Ops>> mUidOps
             = new SparseArray<HashMap<String, Ops>>();
 
-    private int mDeviceOwnerUid;
-    private final SparseIntArray mProfileOwnerUids = new SparseIntArray();
     private final SparseArray<boolean[]> mOpRestrictions = new SparseArray<boolean[]>();
 
     public final static class Ops extends SparseArray<Op> {
@@ -873,15 +871,7 @@
                     }
                 }
             }
-            if (userHandle == UserHandle.USER_OWNER) {
-                if (uid != mDeviceOwnerUid) {
-                    return true;
-                }
-            } else {
-                if (uid != mProfileOwnerUids.get(userHandle, -1)) {
-                    return true;
-                }
-            }
+            return true;
         }
         return false;
     }
@@ -1256,35 +1246,6 @@
     }
 
     @Override
-    public void setDeviceOwner(String packageName) throws RemoteException {
-        checkSystemUid("setDeviceOwner");
-        try {
-            mDeviceOwnerUid = mContext.getPackageManager().getPackageUid(packageName,
-                    UserHandle.USER_OWNER);
-        } catch (NameNotFoundException e) {
-            Log.e(TAG, "Could not find Device Owner UID");
-            mDeviceOwnerUid = -1;
-            throw new IllegalArgumentException("Could not find device owner package "
-                    + packageName);
-        }
-    }
-
-    @Override
-    public void setProfileOwner(String packageName, int userHandle) throws RemoteException {
-        checkSystemUid("setProfileOwner");
-        try {
-            int uid = mContext.getPackageManager().getPackageUid(packageName,
-                    userHandle);
-            mProfileOwnerUids.put(userHandle, uid);
-        } catch (NameNotFoundException e) {
-            Log.e(TAG, "Could not find Profile Owner UID");
-            mProfileOwnerUids.put(userHandle, -1);
-            throw new IllegalArgumentException("Could not find profile owner package "
-                    + packageName);
-        }
-    }
-
-    @Override
     public void setUserRestrictions(Bundle restrictions, int userHandle) throws RemoteException {
         checkSystemUid("setUserRestrictions");
         boolean[] opRestrictions = mOpRestrictions.get(userHandle);
@@ -1306,10 +1267,6 @@
     public void removeUser(int userHandle) throws RemoteException {
         checkSystemUid("removeUser");
         mOpRestrictions.remove(userHandle);
-        final int index = mProfileOwnerUids.indexOfKey(userHandle);
-        if (index >= 0) {
-            mProfileOwnerUids.removeAt(index);
-        }
     }
 
     private void checkSystemUid(String function) {
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index ec9243f..56265e1 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -817,13 +817,7 @@
         mDataConnectionStats = new DataConnectionStats(mContext);
         mDataConnectionStats.startMonitoring();
 
-        // start network sampling ..
-        Intent intent = new Intent(ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED, null);
-        mSampleIntervalElapsedIntent = PendingIntent.getBroadcast(mContext,
-                SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE, intent, 0);
-
         mAlarmManager = (AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
-        setAlarm(DEFAULT_START_SAMPLING_INTERVAL_IN_SECONDS * 1000, mSampleIntervalElapsedIntent);
 
         IntentFilter filter = new IntentFilter();
         filter.addAction(ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED);
@@ -2145,6 +2139,14 @@
     }
 
     void systemReady() {
+        // start network sampling ..
+        Intent intent = new Intent(ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED);
+        intent.setPackage(mContext.getPackageName());
+
+        mSampleIntervalElapsedIntent = PendingIntent.getBroadcast(mContext,
+                SAMPLE_INTERVAL_ELAPSED_REQUEST_CODE, intent, 0);
+        setAlarm(DEFAULT_START_SAMPLING_INTERVAL_IN_SECONDS * 1000, mSampleIntervalElapsedIntent);
+
         if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
             mCaptivePortalTracker = CaptivePortalTracker.makeCaptivePortalTracker(mContext, this);
         }
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 87084d5..cb410ef 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -67,12 +67,22 @@
 /**
  * Since phone process can be restarted, this class provides a centralized place
  * that applications can register and be called back from.
+ *
+ * Change-Id: I450c968bda93767554b5188ee63e10c9f43c5aa4 fixes bugs 16148026
+ * and 15973975 by saving the phoneId of the registrant and then using the
+ * phoneId when deciding to to make a callback. This is necessary because
+ * a subId changes from to a dummy value when a SIM is removed and thus won't
+ * compare properly. Because SubscriptionManager.getPhoneId(long subId) handles
+ * the dummy value conversion we properly do the callbacks.
+ *
+ * Eventually we may want to remove the notion of dummy value but for now this
+ * looks like the best approach.
  */
 class TelephonyRegistry extends ITelephonyRegistry.Stub {
     private static final String TAG = "TelephonyRegistry";
-    private static final boolean DBG = false; // STOPSHIP if true
+    private static final boolean DBG = true; // STOPSHIP if true
     private static final boolean DBG_LOC = false; // STOPSHIP if true
-    private static final boolean VDBG = false; // STOPSHIP if true
+    private static final boolean VDBG = true; // STOPSHIP if true
 
     private static class Record {
         String pkgForDebug;
@@ -87,12 +97,14 @@
 
         long subId;
 
+        int phoneId;
+
         boolean isLegacyApp;
 
         @Override
         public String toString() {
             return "{pkgForDebug=" + pkgForDebug + " callerUid=" + callerUid + " subId=" + subId +
-                    " events=" + Integer.toHexString(events) + "}";
+                    " phoneId=" + phoneId + " events=" + Integer.toHexString(events) + "}";
         }
     }
 
@@ -146,6 +158,8 @@
 
     private long mDefaultSubId;
 
+    private int mDefaultPhoneIdForDefaultSubId;
+
     private DataConnectionRealTimeInfo mDcRtInfo = new DataConnectionRealTimeInfo();
 
     private int mRingingCallState = PreciseCallState.PRECISE_CALL_STATE_IDLE;
@@ -179,15 +193,19 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MSG_USER_SWITCHED: {
-                    log("MSG_USER_SWITCHED userId=" + msg.arg1);
+                    if (VDBG) log("MSG_USER_SWITCHED userId=" + msg.arg1);
                     int numPhones = TelephonyManager.getDefault().getPhoneCount();
                     for (int sub = 0; sub < numPhones; sub++) {
-                        TelephonyRegistry.this.notifyCellLocationUsingSubId(sub, mCellLocation[sub]);
+                        TelephonyRegistry.this.notifyCellLocationUsingSubId(sub,
+                                mCellLocation[sub]);
                     }
                     break;
                 }
                 case MSG_UPDATE_DEFAULT_SUB: {
-                    log("MSG_UPDATE_DEFAULT_SUB subid=" + mDefaultSubId);
+                    if (VDBG) {
+                        log("MSG_UPDATE_DEFAULT_SUB subid=" + mDefaultSubId
+                                + " phoneId=" + mDefaultPhoneIdForDefaultSubId);
+                    }
                     // Default subscription id changed, update the changed default subscription
                     // id in  all the legacy application listener records.
                     synchronized (mRecords) {
@@ -195,6 +213,7 @@
                             // FIXME: Be sure we're using isLegacyApp correctly!
                             if (r.isLegacyApp == true) {
                                 r.subId = mDefaultSubId;
+                                r.phoneId = mDefaultPhoneIdForDefaultSubId;
                             }
                         }
                     }
@@ -208,7 +227,7 @@
         @Override
         public void onReceive(Context context, Intent intent) {
             String action = intent.getAction();
-            log("mBroadcastReceiver: action=" + action);
+            if (VDBG) log("mBroadcastReceiver: action=" + action);
             if (Intent.ACTION_USER_SWITCHED.equals(action)) {
                 int userHandle = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0);
                 if (DBG) log("onReceive: userHandle=" + userHandle);
@@ -216,7 +235,12 @@
             } else if (action.equals(TelephonyIntents.ACTION_DEFAULT_SUBSCRIPTION_CHANGED)) {
                 mDefaultSubId = intent.getLongExtra(PhoneConstants.SUBSCRIPTION_KEY,
                         SubscriptionManager.getDefaultSubId());
-                if (DBG) log("onReceive: mDefaultSubId=" + mDefaultSubId);
+                mDefaultPhoneIdForDefaultSubId = intent.getIntExtra(PhoneConstants.SLOT_KEY,
+                        SubscriptionManager.getPhoneId(mDefaultSubId));
+                if (DBG) {
+                    log("onReceive: mDefaultSubId=" + mDefaultSubId
+                            + " mDefaultPhoneIdForDefaultSubId=" + mDefaultPhoneIdForDefaultSubId);
+                }
                 mHandler.sendMessage(mHandler.obtainMessage(MSG_UPDATE_DEFAULT_SUB, 0, 0));
             }
         }
@@ -236,8 +260,9 @@
         mBatteryStats = BatteryStatsService.getService();
         mConnectedApns = new ArrayList<String>();
 
-        // Initialize default subscription to be used for single standby.
+        // Initialize default subId and its phoneId.
         mDefaultSubId = SubscriptionManager.getDefaultSubId();
+        mDefaultPhoneIdForDefaultSubId = SubscriptionManager.getPhoneId(mDefaultSubId);
 
         int numPhones = TelephonyManager.getDefault().getPhoneCount();
         if (DBG) log("TelephonyRegistor: ctor numPhones=" + numPhones);
@@ -310,9 +335,10 @@
             boolean notifyNow, long subId, boolean isLegacyApp) {
         int callerUid = UserHandle.getCallingUserId();
         int myUid = UserHandle.myUserId();
-        if (true /*VDBG*/) {
+        int phoneId = SubscriptionManager.getPhoneId(subId);
+        if (VDBG) {
             log("listen: E pkg=" + pkgForDebug + " events=0x" + Integer.toHexString(events)
-                + " notifyNow=" + notifyNow + " subId=" + subId
+                + " notifyNow=" + notifyNow + " subId=" + subId + " phoneId=" + phoneId
                 + " isLegacyApp=" + isLegacyApp
                 + " myUid=" + myUid
                 + " callerUid=" + callerUid);
@@ -339,29 +365,33 @@
                     r.pkgForDebug = pkgForDebug;
                     r.callerUid = callerUid;
                     r.subId = subId;
+                    r.phoneId = phoneId;
                     r.isLegacyApp = isLegacyApp;
                     // Legacy applications pass invalid subId(-1), based on
                     // the received subId value update the isLegacyApp field
                     if ((r.subId <= 0) || (r.subId == SubscriptionManager.INVALID_SUB_ID)) {
                         r.subId = mDefaultSubId;
-                        r.isLegacyApp = true; // r.subId is to be update when default changes.
+                        r.phoneId = mDefaultPhoneIdForDefaultSubId;
+                        r.isLegacyApp = true; // subId & phoneId are updated when default changes.
                     }
                     if (r.subId == SubscriptionManager.DEFAULT_SUB_ID) {
                         r.subId = mDefaultSubId;
-                        r.isLegacyApp = true; // r.subId is to be update when default changes.
-                        if (true/*DBG*/) log("listen: DEFAULT_SUB_ID");
+                        r.phoneId = mDefaultPhoneIdForDefaultSubId;
+                        r.isLegacyApp = true; // subId & phoneId are updated when default changes.
+                        if (DBG) log("listen: DEFAULT_SUB_ID");
                     }
                     mRecords.add(r);
-                    if (true/*DBG*/) log("listen: add new record");
+                    if (DBG) log("listen: add new record");
                 }
-                int phoneId = SubscriptionManager.getPhoneId(subId);
                 r.events = events;
-                if (true/*DBG*/) log("listen: set events record=" + r + " subId=" + subId + " phoneId=" + phoneId);
-                toStringLogSSC("listen");
+                if (DBG) {
+                    log("listen: r=" + r + " subId=" + subId + " phoneId=" + phoneId);
+                }
+                if (VDBG) toStringLogSSC("listen");
                 if (notifyNow && validatePhoneId(phoneId)) {
                     if ((events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) {
                         try {
-                            log("listen: call onSSC state=" + mServiceState[phoneId]);
+                            if (VDBG) log("listen: call onSSC state=" + mServiceState[phoneId]);
                             r.callback.onServiceStateChanged(
                                     new ServiceState(mServiceState[phoneId]));
                         } catch (RemoteException ex) {
@@ -516,7 +546,7 @@
         if (!checkNotifyPermission("notifyCallState()")) {
             return;
         }
-        if (true /*VDBG*/) {
+        if (VDBG) {
             log("notifyCallStateUsingSubId: subId=" + subId
                 + " state=" + state + " incomingNumber=" + incomingNumber);
         }
@@ -527,8 +557,8 @@
                 mCallIncomingNumber[phoneId] = incomingNumber;
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_CALL_STATE) != 0) &&
-                        (r.subId == subId) && (r.isLegacyApp == false)) {
-                        // FIXME: why isLegacyApp false?
+                            (r.phoneId == phoneId) &&
+                            (r.isLegacyApp == false)) { // FIXME: why isLegacyApp false?
                         try {
                             r.callback.onCallStateChanged(state, incomingNumber);
                         } catch (RemoteException ex) {
@@ -552,27 +582,32 @@
         }
         if (subId == SubscriptionManager.DEFAULT_SUB_ID) {
             subId = mDefaultSubId;
-            log("notifyServiceStateUsingSubId: using mDefaultSubId=" + mDefaultSubId);
+            if (VDBG) log("notifyServiceStateUsingSubId: using mDefaultSubId=" + mDefaultSubId);
         }
         synchronized (mRecords) {
             int phoneId = SubscriptionManager.getPhoneId(subId);
-            if (true/*VDBG*/) {
+            if (VDBG) {
                 log("notifyServiceStateUsingSubId: subId=" + subId + " phoneId=" + phoneId
                     + " state=" + state);
             }
             if (validatePhoneId(phoneId)) {
                 mServiceState[phoneId] = state;
                 logServiceStateChanged("notifyServiceStateUsingSubId", subId, phoneId, state);
-                toStringLogSSC("notifyServiceStateUsingSubId");
+                if (VDBG) toStringLogSSC("notifyServiceStateUsingSubId");
 
                 for (Record r : mRecords) {
-                    log("notifyServiceStateUsingSubId: r.events=0x" + Integer.toHexString(r.events) + " r.subId=" + r.subId + " subId=" + subId + " state=" + state);
-                    // FIXME: use DEFAULT_SUB_ID instead??
+                    if (VDBG) {
+                        log("notifyServiceStateUsingSubId: r=" + r + " subId=" + subId
+                                + " phoneId=" + phoneId + " state=" + state);
+                    }
                     if (((r.events & PhoneStateListener.LISTEN_SERVICE_STATE) != 0) &&
-                            (r.subId == subId)) {
+                        (r.phoneId == phoneId)) {
                         try {
-                            log("notifyServiceStateUsingSubId: call onSSC subId=" + subId
-                                    + " state=" + state);
+                            if (DBG) {
+                                log("notifyServiceStateUsingSubId: callback.onSSC r=" + r
+                                        + " subId=" + subId + " phoneId=" + phoneId
+                                        + " state=" + state);
+                            }
                             r.callback.onServiceStateChanged(new ServiceState(state));
                         } catch (RemoteException ex) {
                             mRemoveList.add(r.binder);
@@ -595,7 +630,7 @@
         if (!checkNotifyPermission("notifySignalStrength()")) {
             return;
         }
-        if (true/*VDBG*/) {
+        if (VDBG) {
             log("notifySignalStrengthUsingSubId: subId=" + subId
                 + " signalStrength=" + signalStrength);
             toStringLogSSC("notifySignalStrengthUsingSubId");
@@ -603,25 +638,36 @@
         synchronized (mRecords) {
             int phoneId = SubscriptionManager.getPhoneId(subId);
             if (validatePhoneId(phoneId)) {
-                log("notifySignalStrengthUsingSubId: valid phoneId=" + phoneId);
+                if (VDBG) log("notifySignalStrengthUsingSubId: valid phoneId=" + phoneId);
                 mSignalStrength[phoneId] = signalStrength;
                 for (Record r : mRecords) {
-                    log("notifySignalStrengthUsingSubId: r.events=0x" + Integer.toHexString(r.events) + " r.subId=" + r.subId + " subId=" + subId);
+                    if (VDBG) {
+                        log("notifySignalStrengthUsingSubId: r=" + r + " subId=" + subId
+                                + " phoneId=" + phoneId + " ss=" + signalStrength);
+                    }
                     if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTHS) != 0) &&
-                        (r.subId == subId)){
+                        (r.phoneId == phoneId)) {
                         try {
-                            log("notifySignalStrengthUsingSubId: callback.onSsS ss=" + signalStrength);
+                            if (DBG) {
+                                log("notifySignalStrengthUsingSubId: callback.onSsS r=" + r
+                                        + " subId=" + subId + " phoneId=" + phoneId
+                                        + " ss=" + signalStrength);
+                            }
                             r.callback.onSignalStrengthsChanged(new SignalStrength(signalStrength));
                         } catch (RemoteException ex) {
                             mRemoveList.add(r.binder);
                         }
                     }
                     if (((r.events & PhoneStateListener.LISTEN_SIGNAL_STRENGTH) != 0) &&
-                        (r.subId == subId)) {
+                        (r.phoneId == phoneId)) {
                         try {
                             int gsmSignalStrength = signalStrength.getGsmSignalStrength();
                             int ss = (gsmSignalStrength == 99 ? -1 : gsmSignalStrength);
-                            log("notifySignalStrengthUsingSubId: callback.onSS gsmSS=" + gsmSignalStrength + " ss=" + ss);
+                            if (DBG) {
+                                log("notifySignalStrengthUsingSubId: callback.onSS r=" + r
+                                        + " subId=" + subId + " phoneId=" + phoneId
+                                        + " gsmSS=" + gsmSignalStrength + " ss=" + ss);
+                            }
                             r.callback.onSignalStrengthChanged(ss);
                         } catch (RemoteException ex) {
                             mRemoveList.add(r.binder);
@@ -714,7 +760,7 @@
                 mMessageWaiting[phoneId] = mwi;
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_MESSAGE_WAITING_INDICATOR) != 0) &&
-                        (r.subId == subId)) {
+                        (r.phoneId == phoneId)) {
                         try {
                             r.callback.onMessageWaitingIndicatorChanged(mwi);
                         } catch (RemoteException ex) {
@@ -745,7 +791,7 @@
                 mCallForwarding[phoneId] = cfi;
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_CALL_FORWARDING_INDICATOR) != 0) &&
-                        (r.subId == subId)) {
+                        (r.phoneId == phoneId)) {
                         try {
                             r.callback.onCallForwardingIndicatorChanged(cfi);
                         } catch (RemoteException ex) {
@@ -842,7 +888,7 @@
                 }
                 for (Record r : mRecords) {
                     if (((r.events & PhoneStateListener.LISTEN_DATA_CONNECTION_STATE) != 0) &&
-                            (r.subId == subId)) {
+                            (r.phoneId == phoneId)) {
                         try {
                             log("Notify data connection state changed on sub: " +
                                     subId);
@@ -1092,8 +1138,7 @@
             pw.println("  mDcRtInfo=" + mDcRtInfo);
             pw.println("registrations: count=" + recordCount);
             for (Record r : mRecords) {
-                pw.println("  " + r.pkgForDebug + " 0x" + Integer.toHexString(r.events));
-                pw.println("is Legacy = " + r.isLegacyApp + " subId = " + r.subId);
+                pw.println("  " + r);
             }
         }
     }
@@ -1360,6 +1405,7 @@
                     i = 0;
                 }
             } while (i != next);
+            log(prompt + ": ----------------");
         }
     }
 }
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 248a303..20f6f1c 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -55,6 +55,7 @@
 public class VibratorService extends IVibratorService.Stub
         implements InputManager.InputDeviceListener {
     private static final String TAG = "VibratorService";
+    private static final boolean DEBUG = false;
 
     private final LinkedList<Vibration> mVibrations;
     private Vibration mCurrentVibration;
@@ -205,6 +206,7 @@
         }
     }
 
+    @Override // Binder call
     public boolean hasVibrator() {
         return doVibratorExists();
     }
@@ -220,6 +222,7 @@
                 Binder.getCallingPid(), Binder.getCallingUid(), null);
     }
 
+    @Override // Binder call
     public void vibrate(int uid, String opPkg, long milliseconds, int usageHint,
             IBinder token) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
@@ -237,6 +240,10 @@
             return;
         }
 
+        if (DEBUG) {
+            Slog.d(TAG, "Vibrating for " + milliseconds + " ms.");
+        }
+
         Vibration vib = new Vibration(token, milliseconds, usageHint, uid, opPkg);
 
         final long ident = Binder.clearCallingIdentity();
@@ -262,6 +269,7 @@
         return true;
     }
 
+    @Override // Binder call
     public void vibratePattern(int uid, String packageName, long[] pattern, int repeat,
             int usageHint, IBinder token) {
         if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
@@ -272,13 +280,13 @@
         // so wakelock calls will succeed
         long identity = Binder.clearCallingIdentity();
         try {
-            if (false) {
+            if (DEBUG) {
                 String s = "";
                 int N = pattern.length;
                 for (int i=0; i<N; i++) {
                     s += " " + pattern[i];
                 }
-                Slog.i(TAG, "vibrating with pattern: " + s);
+                Slog.d(TAG, "Vibrating with pattern:" + s);
             }
 
             // we're running in the server so we can't fail
@@ -314,6 +322,7 @@
         }
     }
 
+    @Override // Binder call
     public void cancelVibrate(IBinder token) {
         mContext.enforceCallingOrSelfPermission(
                 android.Manifest.permission.VIBRATE,
@@ -325,6 +334,9 @@
             synchronized (mVibrations) {
                 final Vibration vib = removeVibrationLocked(token);
                 if (vib == mCurrentVibration) {
+                    if (DEBUG) {
+                        Slog.d(TAG, "Canceling vibration.");
+                    }
                     doCancelVibrateLocked();
                     startNextVibrationLocked();
                 }
@@ -336,6 +348,7 @@
     }
 
     private final Runnable mVibrationRunnable = new Runnable() {
+        @Override
         public void run() {
             synchronized (mVibrations) {
                 doCancelVibrateLocked();
@@ -516,6 +529,9 @@
 
     private void doVibratorOn(long millis, int uid, int usageHint) {
         synchronized (mInputDeviceVibrators) {
+            if (DEBUG) {
+                Slog.d(TAG, "Turning vibrator on for " + millis + " ms.");
+            }
             try {
                 mBatteryStatsService.noteVibratorOn(uid, millis);
                 mCurVibUid = uid;
@@ -536,6 +552,9 @@
 
     private void doVibratorOff() {
         synchronized (mInputDeviceVibrators) {
+            if (DEBUG) {
+                Slog.d(TAG, "Turning vibrator off.");
+            }
             if (mCurVibUid >= 0) {
                 try {
                     mBatteryStatsService.noteVibratorOff(mCurVibUid);
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 3f95ae2..36093c0 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1159,6 +1159,7 @@
     static final int SYSTEM_USER_START_MSG = 42;
     static final int SYSTEM_USER_CURRENT_MSG = 43;
     static final int ENTER_ANIMATION_COMPLETE_MSG = 44;
+    static final int ENABLE_SCREEN_AFTER_BOOT_MSG = 45;
 
     static final int FIRST_ACTIVITY_STACK_MSG = 100;
     static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -1826,6 +1827,10 @@
                 }
                 break;
             }
+            case ENABLE_SCREEN_AFTER_BOOT_MSG: {
+                enableScreenAfterBoot();
+                break;
+            }
             }
         }
     };
@@ -5525,6 +5530,10 @@
         Binder.restoreCallingIdentity(origId);
     }
 
+    void postEnableScreenAfterBootLocked() {
+        mHandler.sendEmptyMessage(ENABLE_SCREEN_AFTER_BOOT_MSG);
+    }
+
     void enableScreenAfterBoot() {
         EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,
                 SystemClock.uptimeMillis());
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 1c0057b..d069dfe 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1052,6 +1052,14 @@
         next.idle = false;
         next.results = null;
         next.newIntents = null;
+
+        if (next.isHomeActivity() && next.isNotResolverActivity()) {
+            ProcessRecord app = next.task.mActivities.get(0).app;
+            if (app != null && app != mService.mHomeProcess) {
+                mService.mHomeProcess = app;
+            }
+        }
+
         if (next.nowVisible) {
             // We won't get a call to reportActivityVisibleLocked() so dismiss lockscreen now.
             mStackSupervisor.dismissKeyguard();
@@ -2067,6 +2075,8 @@
         final int rootActivityNdx = task.findEffectiveRootIndex();
         for (int i = numActivities - 1; i > rootActivityNdx; --i ) {
             ActivityRecord target = activities.get(i);
+            if (target.frontOfTask)
+                break;
 
             final int flags = target.info.flags;
             final boolean finishOnTaskLaunch =
@@ -2223,6 +2233,8 @@
         // Do not operate on or below the effective root Activity.
         for (int i = numActivities - 1; i > rootActivityNdx; --i) {
             ActivityRecord target = activities.get(i);
+            if (target.frontOfTask)
+                break;
 
             final int flags = target.info.flags;
             boolean finishOnTaskLaunch = (flags & ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH) != 0;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 690b90a..48ed5ea 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -2176,7 +2176,7 @@
         //mWindowManager.dump();
 
         if (enableScreen) {
-            mService.enableScreenAfterBoot();
+            mService.postEnableScreenAfterBootLocked();
         }
 
         if (activityRemoved) {
diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java
index cdcc74b..4e554eb 100644
--- a/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -424,11 +424,16 @@
             Intent intent, int resultCode, String data, Bundle extras,
             boolean ordered, boolean sticky, int sendingUser) throws RemoteException {
         // Send the intent to the receiver asynchronously using one-way binder calls.
-        if (app != null && app.thread != null) {
-            // If we have an app thread, do the call through that so it is
-            // correctly ordered with other one-way calls.
-            app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
-                    data, extras, ordered, sticky, sendingUser, app.repProcState);
+        if (app != null) {
+            if (app.thread != null) {
+                // If we have an app thread, do the call through that so it is
+                // correctly ordered with other one-way calls.
+                app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
+                        data, extras, ordered, sticky, sendingUser, app.repProcState);
+            } else {
+                // Application has died. Receiver doesn't exist.
+                throw new RemoteException("app.thread must not be null");
+            }
         } else {
             receiver.performReceive(intent, resultCode, data, extras, ordered,
                     sticky, sendingUser);
@@ -670,6 +675,7 @@
                             // (local and remote) isn't kept in the mBroadcastHistory.
                             r.resultTo = null;
                         } catch (RemoteException e) {
+                            r.resultTo = null;
                             Slog.w(TAG, "Failure ["
                                     + mQueueName + "] sending broadcast result of "
                                     + r.intent, e);
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index ba9a183..0305424 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -495,9 +495,6 @@
             throw e;
         }
         Log.i(TAG, "Established by " + config.user + " on " + mInterface);
-
-        // TODO: ensure that contract class eventually marks as connected
-        updateState(DetailedState.AUTHENTICATING, "establish");
         return tun;
     }
 
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 09221a3e..d0e4b33 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -566,8 +566,10 @@
         // Apply dimming by at least some minimum amount when user activity
         // timeout is about to expire.
         if (mPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
-            brightness = Math.max(Math.min(brightness - SCREEN_DIM_MINIMUM_REDUCTION,
-                    mScreenBrightnessDimConfig), mScreenBrightnessRangeMinimum);
+            if (brightness > mScreenBrightnessRangeMinimum) {
+                brightness = Math.max(Math.min(brightness - SCREEN_DIM_MINIMUM_REDUCTION,
+                        mScreenBrightnessDimConfig), mScreenBrightnessRangeMinimum);
+            }
             if (!mAppliedDimming) {
                 slowChange = false;
             }
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index 107a6f6..b894304 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -45,7 +45,6 @@
 import android.provider.Settings;
 import android.service.dreams.DreamManagerInternal;
 import android.service.dreams.DreamService;
-import android.service.dreams.IDozeHardware;
 import android.service.dreams.IDreamManager;
 import android.text.TextUtils;
 import android.util.Slog;
@@ -75,7 +74,6 @@
     private final PowerManager mPowerManager;
     private final PowerManagerInternal mPowerManagerInternal;
     private final PowerManager.WakeLock mDozeWakeLock;
-    private final McuHal mMcuHal; // synchronized on self
 
     private Binder mCurrentDreamToken;
     private ComponentName mCurrentDreamName;
@@ -86,7 +84,6 @@
     private boolean mCurrentDreamIsWaking;
     private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN;
     private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
-    private DozeHardwareWrapper mCurrentDreamDozeHardware;
 
     public DreamManagerService(Context context) {
         super(context);
@@ -97,11 +94,6 @@
         mPowerManager = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
         mPowerManagerInternal = getLocalService(PowerManagerInternal.class);
         mDozeWakeLock = mPowerManager.newWakeLock(PowerManager.DOZE_WAKE_LOCK, TAG);
-
-        mMcuHal = McuHal.open();
-        if (mMcuHal != null) {
-            mMcuHal.reset();
-        }
     }
 
     @Override
@@ -130,9 +122,6 @@
     private void dumpInternal(PrintWriter pw) {
         pw.println("DREAM MANAGER (dumpsys dreams)");
         pw.println();
-
-        pw.println("mMcuHal=" + mMcuHal);
-        pw.println();
         pw.println("mCurrentDreamToken=" + mCurrentDreamToken);
         pw.println("mCurrentDreamName=" + mCurrentDreamName);
         pw.println("mCurrentDreamUserId=" + mCurrentDreamUserId);
@@ -143,7 +132,6 @@
         pw.println("mCurrentDreamDozeScreenState="
                 + Display.stateToString(mCurrentDreamDozeScreenState));
         pw.println("mCurrentDreamDozeScreenBrightness=" + mCurrentDreamDozeScreenBrightness);
-        pw.println("mCurrentDreamDozeHardware=" + mCurrentDreamDozeHardware);
         pw.println("getDozeComponent()=" + getDozeComponent());
         pw.println();
 
@@ -259,17 +247,6 @@
         }
     }
 
-    private IDozeHardware getDozeHardwareInternal(IBinder token) {
-        synchronized (mLock) {
-            if (mCurrentDreamToken == token && mCurrentDreamCanDoze
-                    && mCurrentDreamDozeHardware == null && mMcuHal != null) {
-                mCurrentDreamDozeHardware = new DozeHardwareWrapper();
-                return mCurrentDreamDozeHardware;
-            }
-            return null;
-        }
-    }
-
     private ComponentName chooseDreamForUser(boolean doze, int userId) {
         if (doze) {
             ComponentName dozeComponent = getDozeComponent();
@@ -420,10 +397,6 @@
         }
         mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN;
         mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
-        if (mCurrentDreamDozeHardware != null) {
-            mCurrentDreamDozeHardware.release();
-            mCurrentDreamDozeHardware = null;
-        }
     }
 
     private void checkPermission(String permission) {
@@ -642,21 +615,6 @@
                 Binder.restoreCallingIdentity(ident);
             }
         }
-
-        @Override // Binder call
-        public IDozeHardware getDozeHardware(IBinder token) {
-            // Requires no permission, called by Dream from an arbitrary process.
-            if (token == null) {
-                throw new IllegalArgumentException("token must not be null");
-            }
-
-            final long ident = Binder.clearCallingIdentity();
-            try {
-                return getDozeHardwareInternal(token);
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-            }
-        }
     }
 
     private final class LocalService extends DreamManagerInternal {
@@ -676,40 +634,6 @@
         }
     }
 
-    private final class DozeHardwareWrapper extends IDozeHardware.Stub {
-        private boolean mReleased;
-
-        public void release() {
-            synchronized (mMcuHal) {
-                if (!mReleased) {
-                    mReleased = true;
-                    mMcuHal.reset();
-                }
-            }
-        }
-
-        @Override // Binder call
-        public byte[] sendMessage(String msg, byte[] arg) {
-            if (msg == null) {
-                throw new IllegalArgumentException("msg must not be null");
-            }
-
-            final long ident = Binder.clearCallingIdentity();
-            try {
-                synchronized (mMcuHal) {
-                    if (mReleased) {
-                        Slog.w(TAG, "Ignoring message to MCU HAL because the dream "
-                                + "has already ended: " + msg);
-                        return null;
-                    }
-                    return mMcuHal.sendMessage(msg, arg);
-                }
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-            }
-        }
-    }
-
     private final Runnable mSystemPropertiesChanged = new Runnable() {
         @Override
         public void run() {
diff --git a/services/core/java/com/android/server/dreams/McuHal.java b/services/core/java/com/android/server/dreams/McuHal.java
deleted file mode 100644
index 1dc79c7..0000000
--- a/services/core/java/com/android/server/dreams/McuHal.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2014 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.server.dreams;
-
-import android.service.dreams.DozeHardware;
-
-/**
- * Provides access to the low-level microcontroller hardware abstraction layer.
- */
-final class McuHal {
-    private final long mPtr;
-
-    private static native long nativeOpen();
-    private static native byte[] nativeSendMessage(long ptr, String msg, byte[] arg);
-
-    private McuHal(long ptr) {
-        mPtr = ptr;
-    }
-
-    public static McuHal open() {
-        long ptr = nativeOpen();
-        return ptr != 0 ? new McuHal(ptr) : null;
-    }
-
-    public void reset() {
-        sendMessage(DozeHardware.MSG_ENABLE_MCU, DozeHardware.VALUE_OFF);
-    }
-
-    public byte[] sendMessage(String msg, byte[] arg) {
-        return nativeSendMessage(mPtr, msg, arg);
-    }
-}
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
index 432424b..f3d570e 100644
--- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
+++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
@@ -23,6 +23,8 @@
 import android.os.RemoteException;
 import android.util.Slog;
 
+import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
+
 /**
  * Handles CEC command &lt;Active Source&gt;.
  * <p>
@@ -54,44 +56,45 @@
     /**
      * Handles the incoming active source command.
      *
-     * @param activeAddress logical address of the device to be the active source
-     * @param activePath routing path of the device to be the active source
+     * @param newActive new active source information
      */
-    void process(int activeAddress, int activePath) {
+    void process(ActiveSource newActive) {
         // Seq #17
         HdmiCecLocalDeviceTv tv = mSource;
-        if (getSourcePath() == activePath && tv.getActiveSource() == getSourceAddress()) {
+        ActiveSource activeSource = tv.getActiveSource();
+        if (activeSource.equals(newActive)) {
             invokeCallback(HdmiControlManager.RESULT_SUCCESS);
             return;
         }
-        HdmiCecDeviceInfo device = mService.getDeviceInfo(activeAddress);
+        HdmiCecDeviceInfo device = mService.getDeviceInfo(newActive.logicalAddress);
         if (device == null) {
-            tv.startNewDeviceAction(activeAddress, activePath);
+            tv.startNewDeviceAction(newActive);
         }
 
-        int currentActive = tv.getActiveSource();
-        int currentPath = tv.getActivePath();
+        ActiveSource current = tv.getActiveSource();
         if (!tv.isProhibitMode()) {
-            tv.updateActiveSource(activeAddress, activePath);
-            if (currentActive != activeAddress && currentPath != activePath) {
-                tv.updateActivePortId(mService.pathToPortId(activePath));
+            tv.updateActiveSource(newActive);
+            if (!current.equals(newActive)) {
+                boolean notifyInputChange = (mCallback == null);
+                tv.updateActiveInput(newActive.physicalAddress, notifyInputChange);
             }
             invokeCallback(HdmiControlManager.RESULT_SUCCESS);
         } else {
             // TV is in a mode that should keep its current source/input from
             // being changed for its operation. Reclaim the active source
             // or switch the port back to the one used for the current mode.
-            if (currentActive == getSourceAddress()) {
-                HdmiCecMessage activeSource =
-                        HdmiCecMessageBuilder.buildActiveSource(currentActive, currentPath);
-                mService.sendCecCommand(activeSource);
-                tv.updateActiveSource(currentActive, currentPath);
+            if (current.logicalAddress == getSourceAddress()) {
+                HdmiCecMessage activeSourceCommand = HdmiCecMessageBuilder.buildActiveSource(
+                        current.logicalAddress, current.physicalAddress);
+                mService.sendCecCommand(activeSourceCommand);
+                tv.updateActiveSource(current);
                 invokeCallback(HdmiControlManager.RESULT_SUCCESS);
             } else {
                 HdmiCecMessage routingChange = HdmiCecMessageBuilder.buildRoutingChange(
-                        getSourceAddress(), activePath, currentPath);
+                        getSourceAddress(), newActive.physicalAddress, current.physicalAddress);
                 mService.sendCecCommand(routingChange);
-                tv.addAndStartAction(new RoutingControlAction(tv, currentPath, true, mCallback));
+                tv.addAndStartAction(
+                        new RoutingControlAction(tv, current.physicalAddress, true, mCallback));
             }
         }
     }
diff --git a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java
index d4fffcf..018b34d 100644
--- a/services/core/java/com/android/server/hdmi/DeviceSelectAction.java
+++ b/services/core/java/com/android/server/hdmi/DeviceSelectAction.java
@@ -23,6 +23,7 @@
 import android.os.RemoteException;
 import android.util.Slog;
 
+import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
 import com.android.server.hdmi.HdmiControlService.SendMessageCallback;
 
 /**
@@ -130,10 +131,10 @@
                 return false;
             case STATE_WAIT_FOR_ACTIVE_SOURCE:
                 if (opcode == Constants.MESSAGE_ACTIVE_SOURCE) {
-                    int activePath = HdmiUtils.twoBytesToInt(params);
+                    int physicalAddress = HdmiUtils.twoBytesToInt(params);
                     ActiveSourceHandler
                             .create((HdmiCecLocalDeviceTv) localDevice(), mCallback)
-                            .process(cmd.getSource(), activePath);
+                            .process(ActiveSource.of(cmd.getSource(), physicalAddress));
                     finish();
                     return true;
                 }
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index dbcdfc0..40eb3e44 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -49,9 +49,41 @@
     protected int mPreferredAddress;
     protected HdmiCecDeviceInfo mDeviceInfo;
 
+    static class ActiveSource {
+        int logicalAddress;
+        int physicalAddress;
+
+        public ActiveSource(int logical, int physical) {
+            logicalAddress = logical;
+            physicalAddress = physical;
+        }
+        public static ActiveSource of(int logical, int physical) {
+            return new ActiveSource(logical, physical);
+        }
+        public boolean isValid() {
+            return HdmiUtils.isValidAddress(logicalAddress);
+        }
+        public boolean equals(int logical, int physical) {
+            return logicalAddress == logical && physicalAddress == physical;
+        }
+        @Override
+        public boolean equals(Object obj) {
+            if (obj instanceof ActiveSource) {
+                ActiveSource that = (ActiveSource) obj;
+                return that.logicalAddress == logicalAddress &&
+                       that.physicalAddress == physicalAddress;
+            }
+            return false;
+        }
+        @Override
+        public int hashCode() {
+            return logicalAddress * 29 + physicalAddress;
+        }
+    }
     // Logical address of the active source.
     @GuardedBy("mLock")
-    private int mActiveSource;
+    protected final ActiveSource mActiveSource =
+            new ActiveSource(-1, Constants.INVALID_PHYSICAL_ADDRESS);
 
     // Active routing path. Physical address of the active source but not all the time, such as
     // when the new active source does not claim itself to be one. Note that we don't keep
@@ -549,15 +581,24 @@
         return mService.isConnectedToArcPort(path);
     }
 
-    int getActiveSource() {
+    ActiveSource getActiveSource() {
         synchronized (mLock) {
             return mActiveSource;
         }
     }
 
-    void setActiveSource(int source) {
+    void setActiveSource(ActiveSource newActive) {
+        setActiveSource(newActive.logicalAddress, newActive.physicalAddress);
+    }
+
+    void setActiveSource(HdmiCecDeviceInfo info) {
+        setActiveSource(info.getLogicalAddress(), info.getPhysicalAddress());
+    }
+
+    void setActiveSource(int logicalAddress, int physicalAddress) {
         synchronized (mLock) {
-            mActiveSource = source;
+            mActiveSource.logicalAddress = logicalAddress;
+            mActiveSource.physicalAddress = physicalAddress;
         }
     }
 
@@ -596,13 +637,6 @@
         }
     }
 
-    void updateActiveDevice(int logicalAddress, int physicalAddress) {
-        synchronized (mLock) {
-            mActiveSource = logicalAddress;
-            mActiveRoutingPath = physicalAddress;
-        }
-    }
-
     @ServiceThreadOnly
     HdmiCecMessageCache getCecMessageCache() {
         assertRunOnServiceThread();
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 0d457e3..f93d20f 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -147,12 +147,15 @@
         if (targetAddress == Constants.ADDR_INTERNAL) {
             handleSelectInternalSource();
             // Switching to internal source is always successful even when CEC control is disabled.
-            setActiveSource(targetAddress);
+            setActiveSource(targetAddress, mService.getPhysicalAddress());
             invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
             return;
         }
         if (!mService.isControlEnabled()) {
-            setActiveSource(targetAddress);
+            HdmiCecDeviceInfo info = getDeviceInfo(targetAddress);
+            if (info != null) {
+                setActiveSource(info);
+            }
             invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
             return;
         }
@@ -169,7 +172,7 @@
     private void handleSelectInternalSource() {
         assertRunOnServiceThread();
         // Seq #18
-        if (mService.isControlEnabled() && getActiveSource() != mAddress) {
+        if (mService.isControlEnabled() && mActiveSource.logicalAddress != mAddress) {
             updateActiveSource(mAddress, mService.getPhysicalAddress());
             // TODO: Check if this comes from <Text/Image View On> - if true, do nothing.
             HdmiCecMessage activeSource = HdmiCecMessageBuilder.buildActiveSource(
@@ -179,16 +182,22 @@
     }
 
     @ServiceThreadOnly
-    void updateActiveSource(int activeSource, int activePath) {
+    void updateActiveSource(int logicalAddress, int physicalAddress) {
+        assertRunOnServiceThread();
+        updateActiveSource(ActiveSource.of(logicalAddress, physicalAddress));
+    }
+
+    @ServiceThreadOnly
+    void updateActiveSource(ActiveSource newActive) {
         assertRunOnServiceThread();
         // Seq #14
-        if (activeSource == getActiveSource() && activePath == getActivePath()) {
+        if (mActiveSource.equals(newActive)) {
             return;
         }
-        setActiveSource(activeSource);
-        setActivePath(activePath);
-        if (getDeviceInfo(activeSource) != null && activeSource != mAddress) {
-            if (mService.pathToPortId(activePath) == getActivePortId()) {
+        setActiveSource(newActive);
+        int logicalAddress = newActive.logicalAddress;
+        if (getDeviceInfo(logicalAddress) != null && logicalAddress != mAddress) {
+            if (mService.pathToPortId(newActive.physicalAddress) == getActivePortId()) {
                 setPrevPortId(getActivePortId());
             }
             // TODO: Show the OSD banner related to the new active source device.
@@ -222,16 +231,26 @@
     }
 
     @ServiceThreadOnly
-    void updateActivePortId(int portId) {
+    void updateActiveInput(int path, boolean notifyInputChange) {
         assertRunOnServiceThread();
         // Seq #15
+        int portId = mService.pathToPortId(path);
         if (portId == getActivePortId()) {
             return;
         }
+        setActivePath(path);
         setPrevPortId(portId);
-        // TODO: Actually switch the physical port here. Handle PAP/PIP as well.
-        //       Show OSD port change banner
-        mService.invokeInputChangeListener(getActiveSource());
+        // TODO: Handle PAP/PIP case.
+        // Show OSD port change banner
+        if (notifyInputChange) {
+            ActiveSource activeSource = getActiveSource();
+            HdmiCecDeviceInfo info = getDeviceInfo(activeSource.logicalAddress);
+            if (info == null) {
+                info = new HdmiCecDeviceInfo(Constants.ADDR_INVALID, path, portId,
+                        HdmiCecDeviceInfo.DEVICE_RESERVED, 0, null);
+            }
+            mService.invokeInputChangeListener(info);
+        }
     }
 
     @ServiceThreadOnly
@@ -242,26 +261,25 @@
             invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
             return;
         }
+        if (portId == getActivePortId()) {
+            invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
+            return;
+        }
+        setActiveSource(Constants.ADDR_INVALID, Constants.INVALID_PHYSICAL_ADDRESS);
         if (!mService.isControlEnabled()) {
             setActivePortId(portId);
             invokeCallback(callback, HdmiControlManager.RESULT_INCORRECT_MODE);
             return;
         }
-        if (portId == getActivePortId()) {
-            invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
-            return;
-        }
-        setActivePortId(portId);
         // TODO: Return immediately if the operation is triggered by <Text/Image View On>
-        //       and this is the first notification about the active input after power-on
-        //       (switch to HDMI didn't happen so far but is expected to happen soon).
-        removeAction(RoutingControlAction.class);
-
-        int oldPath = mService.portIdToPath(mService.portIdToPath(getActivePortId()));
+        // and this is the first notification about the active input after power-on
+        // (switch to HDMI didn't happen so far but is expected to happen soon).
+        int oldPath = mService.portIdToPath(getActivePortId());
         int newPath = mService.portIdToPath(portId);
         HdmiCecMessage routingChange =
                 HdmiCecMessageBuilder.buildRoutingChange(mAddress, oldPath, newPath);
         mService.sendCecCommand(routingChange);
+        removeAction(RoutingControlAction.class);
         addAndStartAction(new RoutingControlAction(this, newPath, false, callback));
     }
 
@@ -284,7 +302,8 @@
             action.get(0).processKeyEvent(keyCode, isPressed);
         } else {
             if (isPressed) {
-                addAndStartAction(new SendKeyAction(this, getActiveSource(), keyCode));
+                int logicalAddress = getActiveSource().logicalAddress;
+                addAndStartAction(new SendKeyAction(this, logicalAddress, keyCode));
             } else {
                 Slog.w(TAG, "Discard key release event");
             }
@@ -306,12 +325,13 @@
     @ServiceThreadOnly
     protected boolean handleActiveSource(HdmiCecMessage message) {
         assertRunOnServiceThread();
-        int address = message.getSource();
-        int path = HdmiUtils.twoBytesToInt(message.getParams());
-        if (getDeviceInfo(address) == null) {
-            handleNewDeviceAtTheTailOfActivePath(path);
+        int logicalAddress = message.getSource();
+        int physicalAddress = HdmiUtils.twoBytesToInt(message.getParams());
+        if (getDeviceInfo(logicalAddress) == null) {
+            handleNewDeviceAtTheTailOfActivePath(physicalAddress);
         } else {
-            ActiveSourceHandler.create(this, null).process(address, path);
+            ActiveSource activeSource = ActiveSource.of(logicalAddress, physicalAddress);
+            ActiveSourceHandler.create(this, null).process(activeSource);
         }
         return true;
     }
@@ -323,7 +343,7 @@
         // Seq #10
 
         // Ignore <Inactive Source> from non-active source device.
-        if (getActiveSource() != message.getSource()) {
+        if (getActiveSource().logicalAddress != message.getSource()) {
             return true;
         }
         if (isProhibitMode()) {
@@ -342,7 +362,6 @@
             }
             // TODO: Switch the TV freeze mode off
 
-            setActivePortId(portId);
             doManualPortSwitching(portId, null);
             setPrevPortId(Constants.INVALID_PORT_ID);
         }
@@ -354,7 +373,7 @@
     protected boolean handleRequestActiveSource(HdmiCecMessage message) {
         assertRunOnServiceThread();
         // Seq #19
-        if (mAddress == getActiveSource()) {
+        if (mAddress == getActiveSource().logicalAddress) {
             mService.sendCecCommand(
                     HdmiCecMessageBuilder.buildActiveSource(mAddress, getActivePath()));
         }
@@ -392,11 +411,11 @@
         if (!isInDeviceList(path, address)) {
             handleNewDeviceAtTheTailOfActivePath(path);
         }
-        startNewDeviceAction(address, path);
+        startNewDeviceAction(ActiveSource.of(address, path));
         return true;
     }
 
-    void startNewDeviceAction(int address, int path) {
+    void startNewDeviceAction(ActiveSource activeSource) {
         for (NewDeviceAction action : getActions(NewDeviceAction.class)) {
             // If there is new device action which has the same logical address and path
             // ignore new request.
@@ -406,12 +425,13 @@
             // in. However, TV can detect a new device from HotPlugDetectionAction,
             // which sends <Give Physical Address> to the source for newly detected
             // device.
-            if (action.isActionOf(address, path)) {
+            if (action.isActionOf(activeSource)) {
                 return;
             }
         }
 
-        addAndStartAction(new NewDeviceAction(this, address, path));
+        addAndStartAction(new NewDeviceAction(this, activeSource.logicalAddress,
+                activeSource.physicalAddress));
     }
 
     private void handleNewDeviceAtTheTailOfActivePath(int path) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 3532213..37c297b 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -724,6 +724,10 @@
             runOnServiceThread(new Runnable() {
                 @Override
                 public void run() {
+                    if (callback == null) {
+                        Slog.e(TAG, "Callback cannot be null");
+                        return;
+                    }
                     HdmiCecLocalDeviceTv tv = tv();
                     if (tv == null) {
                         Slog.w(TAG, "Local tv device not available");
@@ -741,6 +745,10 @@
             runOnServiceThread(new Runnable() {
                 @Override
                 public void run() {
+                    if (callback == null) {
+                        Slog.e(TAG, "Callback cannot be null");
+                        return;
+                    }
                     HdmiCecLocalDeviceTv tv = tv();
                     if (tv == null) {
                         Slog.w(TAG, "Local tv device not available");
@@ -1218,12 +1226,11 @@
         }
     }
 
-    void invokeInputChangeListener(int activeAddress) {
+    void invokeInputChangeListener(HdmiCecDeviceInfo info) {
         synchronized (mLock) {
             if (mInputChangeListener != null) {
-                HdmiCecDeviceInfo activeSource = getDeviceInfo(activeAddress);
                 try {
-                    mInputChangeListener.onChanged(activeSource);
+                    mInputChangeListener.onChanged(info);
                 } catch (RemoteException e) {
                     Slog.w(TAG, "Exception thrown by IHdmiInputChangeListener: " + e);
                 }
diff --git a/services/core/java/com/android/server/hdmi/NewDeviceAction.java b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
index 4ef7c96..907015b 100644
--- a/services/core/java/com/android/server/hdmi/NewDeviceAction.java
+++ b/services/core/java/com/android/server/hdmi/NewDeviceAction.java
@@ -18,6 +18,7 @@
 import android.hardware.hdmi.HdmiCecDeviceInfo;
 import android.util.Slog;
 
+import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
 import java.io.UnsupportedEncodingException;
 
 /**
@@ -190,7 +191,8 @@
         }
     }
 
-    boolean isActionOf(int address, int path) {
-        return (mDeviceLogicalAddress == address) && (mDevicePhysicalAddress == path);
+    boolean isActionOf(ActiveSource activeSource) {
+        return (mDeviceLogicalAddress == activeSource.logicalAddress)
+                && (mDevicePhysicalAddress == activeSource.physicalAddress);
     }
 }
diff --git a/services/core/java/com/android/server/hdmi/RoutingControlAction.java b/services/core/java/com/android/server/hdmi/RoutingControlAction.java
index 8296f69..f05394f 100644
--- a/services/core/java/com/android/server/hdmi/RoutingControlAction.java
+++ b/services/core/java/com/android/server/hdmi/RoutingControlAction.java
@@ -60,6 +60,12 @@
     // true if <Give Power Status> should be sent once the new active routing path is determined.
     private final boolean mQueryDevicePowerStatus;
 
+    // If set to true, call {@link HdmiControlService#invokeInputChangeListener()} when
+    // the routing control/active source change happens. The listener should be called if
+    // the events are triggered by external events such as manual switch port change or incoming
+    // <Inactive Source> command.
+    private final boolean mNotifyInputChange;
+
     @Nullable private final IHdmiControlCallback mCallback;
 
     // The latest routing path. Updated by each <Routing Information> from CEC switches.
@@ -71,6 +77,11 @@
         mCallback = callback;
         mCurrentRoutingPath = path;
         mQueryDevicePowerStatus = queryDevicePowerStatus;
+        // Callback is non-null when routing control action is brought up by binder API. Use
+        // this as an indicator for the input change notification. These API calls will get
+        // the result through this callback, not through notification. Any other events that
+        // trigger the routing control is external, for which notifcation is used.
+        mNotifyInputChange = (callback == null);
     }
 
     @Override
@@ -111,7 +122,7 @@
             if (isPowerOnOrTransient(devicePowerStatus)) {
                 sendSetStreamPath();
             } else {
-                tv().updateActivePortId(tv().pathToPortId(mCurrentRoutingPath));
+                tv().updateActiveInput(mCurrentRoutingPath, mNotifyInputChange);
             }
         }
         finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
@@ -155,13 +166,13 @@
                         }
                     });
                 } else {
-                    tv().updateActivePortId(tv().pathToPortId(mCurrentRoutingPath));
+                    tv().updateActiveInput(mCurrentRoutingPath, mNotifyInputChange);
                     finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
                 }
                 return;
             case STATE_WAIT_FOR_REPORT_POWER_STATUS:
                 if (isPowerOnOrTransient(getTvPowerStatus())) {
-                    tv().updateActivePortId(tv().pathToPortId(mCurrentRoutingPath));
+                    tv().updateActiveInput(mCurrentRoutingPath, mNotifyInputChange);
                     sendSetStreamPath();
                 }
                 finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
@@ -179,7 +190,7 @@
             mState = STATE_WAIT_FOR_REPORT_POWER_STATUS;
             addTimer(mState, TIMEOUT_REPORT_POWER_STATUS_MS);
         } else {
-            tv().updateActivePortId(tv().pathToPortId(mCurrentRoutingPath));
+            tv().updateActiveInput(mCurrentRoutingPath, mNotifyInputChange);
             sendSetStreamPath();
             finishWithCallback(HdmiControlManager.RESULT_SUCCESS);
         }
diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java
index 451960c..2213934 100644
--- a/services/core/java/com/android/server/job/controllers/IdleController.java
+++ b/services/core/java/com/android/server/job/controllers/IdleController.java
@@ -184,6 +184,16 @@
 
     @Override
     public void dumpControllerState(PrintWriter pw) {
-
+        synchronized (mTrackedTasks) {
+            pw.print("Idle: ");
+            pw.println(mIdleTracker.isIdle() ? "true" : "false");
+            pw.println(mTrackedTasks.size());
+            for (int i = 0; i < mTrackedTasks.size(); i++) {
+                final JobStatus js = mTrackedTasks.get(i);
+                pw.print("  ");
+                pw.print(String.valueOf(js.hashCode()).substring(0, 3));
+                pw.println("..");
+            }
+        }
     }
 }
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index a6711c3..f117f99 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -740,6 +740,13 @@
     private SettingsObserver mSettingsObserver;
     private ZenModeHelper mZenModeHelper;
 
+    private final Runnable mBuzzBeepBlinked = new Runnable() {
+        @Override
+        public void run() {
+            mStatusBar.buzzBeepBlinked();
+        }
+    };
+
     static long[] getLongArray(Resources r, int resid, int maxlen, long[] def) {
         int[] ar = r.getIntArray(resid);
         if (ar == null) {
@@ -1645,6 +1652,7 @@
     }
 
     private void buzzBeepBlinkLocked(NotificationRecord record) {
+        boolean buzzBeepBlinked = false;
         final Notification notification = record.sbn.getNotification();
 
         // Should this notification make noise, vibe, or use the LED?
@@ -1726,6 +1734,7 @@
                                     + " on stream " + audioStreamType);
                             player.playAsync(soundUri, record.sbn.getUser(), looping,
                                     audioStreamType);
+                            buzzBeepBlinked = true;
                         }
                     } catch (RemoteException e) {
                     } finally {
@@ -1765,6 +1774,7 @@
                                 : mFallbackVibrationPattern,
                             ((notification.flags & Notification.FLAG_INSISTENT) != 0)
                                 ? 0: -1, audioAttributesForNotification(notification));
+                        buzzBeepBlinked = true;
                     } finally {
                         Binder.restoreCallingIdentity(identity);
                     }
@@ -1775,6 +1785,7 @@
                             notification.vibrate,
                         ((notification.flags & Notification.FLAG_INSISTENT) != 0)
                                 ? 0: -1, audioAttributesForNotification(notification));
+                    buzzBeepBlinked = true;
                 }
             }
         }
@@ -1791,9 +1802,13 @@
             if (mUseAttentionLight) {
                 mAttentionLight.pulse();
             }
+            buzzBeepBlinked = true;
         } else if (wasShowLights) {
             updateLightsLocked();
         }
+        if (buzzBeepBlinked) {
+            mHandler.post(mBuzzBeepBlinked);
+        }
     }
 
     private static AudioAttributes audioAttributesForNotification(Notification n) {
diff --git a/services/core/java/com/android/server/notification/ZenLog.java b/services/core/java/com/android/server/notification/ZenLog.java
index 81f64b1..3069ad9 100644
--- a/services/core/java/com/android/server/notification/ZenLog.java
+++ b/services/core/java/com/android/server/notification/ZenLog.java
@@ -30,6 +30,8 @@
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
 
 public class ZenLog {
     private static final String TAG = "ZenLog";
@@ -41,6 +43,10 @@
     private static final String[] MSGS = new String[SIZE];
 
     private static final SimpleDateFormat FORMAT = new SimpleDateFormat("MM-dd HH:mm:ss.SSS");
+    private static final Set<String> SYSTEM_PACKAGES = new HashSet<String>(Arrays.asList(
+            "android",
+            "com.android.systemui"
+            ));
 
     private static final int TYPE_INTERCEPTED = 1;
     private static final int TYPE_ALLOW_DISABLE = 2;
@@ -61,6 +67,7 @@
     }
 
     public static void traceAllowDisable(String pkg, boolean allowDisable, String reason) {
+        if (SYSTEM_PACKAGES.contains(pkg)) return;
         append(TYPE_ALLOW_DISABLE, allowDisable + "," + pkg + "," + reason);
     }
 
diff --git a/services/core/java/com/android/server/notification/ZenModeHelper.java b/services/core/java/com/android/server/notification/ZenModeHelper.java
index a896550..1289cf7 100644
--- a/services/core/java/com/android/server/notification/ZenModeHelper.java
+++ b/services/core/java/com/android/server/notification/ZenModeHelper.java
@@ -37,7 +37,9 @@
 import android.net.Uri;
 import android.os.Handler;
 import android.os.IBinder;
+import android.os.UserHandle;
 import android.provider.Settings.Global;
+import android.provider.Settings.Secure;
 import android.service.notification.ZenModeConfig;
 import android.telecomm.TelecommManager;
 import android.util.Slog;
@@ -53,11 +55,9 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
+import java.util.Objects;
 
 /**
  * NotificationManagerService helper for functionality related to zen mode.
@@ -84,17 +84,6 @@
     private AudioManager mAudioManager;
     private int mPreviousRingerMode = -1;
 
-    // temporary, until we update apps to provide metadata
-    private static final Set<String> MESSAGE_PACKAGES = new HashSet<String>(Arrays.asList(
-            "com.google.android.talk",
-            "com.android.mms",
-            "com.android.example.notificationshowcase"
-            ));
-    private static final Set<String> SYSTEM_PACKAGES = new HashSet<String>(Arrays.asList(
-            "android",
-            "com.android.systemui"
-            ));
-
     public ZenModeHelper(Context context, Handler handler) {
         mContext = context;
         mHandler = handler;
@@ -249,9 +238,7 @@
             allowDisable = mZenMode == Global.ZEN_MODE_OFF || mConfig.allowCalls;
             reason = mZenMode == Global.ZEN_MODE_OFF ? "zenOff" : "allowCalls";
         }
-        if (!SYSTEM_PACKAGES.contains(pkg)) {
-            ZenLog.traceAllowDisable(pkg, allowDisable, reason);
-        }
+        ZenLog.traceAllowDisable(pkg, allowDisable, reason);
         return allowDisable;
     }
 
@@ -305,8 +292,7 @@
     }
 
     private boolean isSystem(NotificationRecord record) {
-        return SYSTEM_PACKAGES.contains(record.sbn.getPackageName())
-                && record.isCategory(Notification.CATEGORY_SYSTEM);
+        return record.isCategory(Notification.CATEGORY_SYSTEM);
     }
 
     private boolean isAlarm(NotificationRecord record) {
@@ -330,8 +316,16 @@
                 && pkg.equals(mDefaultPhoneApp.getPackageName());
     }
 
+    private boolean isDefaultMessagingApp(NotificationRecord record) {
+        final int userId = record.getUserId();
+        if (userId == UserHandle.USER_NULL || userId == UserHandle.USER_ALL) return false;
+        final String defaultApp = Secure.getStringForUser(mContext.getContentResolver(),
+                Secure.SMS_DEFAULT_APPLICATION, userId);
+        return Objects.equals(defaultApp, record.sbn.getPackageName());
+    }
+
     private boolean isMessage(NotificationRecord record) {
-        return MESSAGE_PACKAGES.contains(record.sbn.getPackageName());
+        return record.isCategory(Notification.CATEGORY_MESSAGE) || isDefaultMessagingApp(record);
     }
 
     private boolean audienceMatches(NotificationRecord record) {
diff --git a/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java b/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java
index 3ce19c1f..c61d344 100644
--- a/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java
+++ b/services/core/java/com/android/server/pm/CrossProfileIntentFilter.java
@@ -33,17 +33,24 @@
 class CrossProfileIntentFilter extends IntentFilter {
     private static final String ATTR_TARGET_USER_ID = "targetUserId";
     private static final String ATTR_FLAGS = "flags";
+    private static final String ATTR_OWNER_USER_ID = "ownerUserId";
+    private static final String ATTR_OWNER_PACKAGE = "ownerPackage";
     private static final String ATTR_FILTER = "filter";
 
     private static final String TAG = "CrossProfileIntentFilter";
 
     // If the intent matches the IntentFilter, then it can be forwarded to this userId.
     final int mTargetUserId;
+    final int mOwnerUserId; // userId of the app which has set this CrossProfileIntentFilter.
+    final String mOwnerPackage; // packageName of the app.
     final int mFlags;
 
-    CrossProfileIntentFilter(IntentFilter filter, int targetUserId, int flags) {
+    CrossProfileIntentFilter(IntentFilter filter, String ownerPackage, int ownerUserId,
+            int targetUserId, int flags) {
         super(filter);
         mTargetUserId = targetUserId;
+        mOwnerUserId = ownerUserId;
+        mOwnerPackage = ownerPackage;
         mFlags = flags;
     }
 
@@ -55,25 +62,20 @@
         return mFlags;
     }
 
+    public int getOwnerUserId() {
+        return mOwnerUserId;
+    }
+
+    public String getOwnerPackage() {
+        return mOwnerPackage;
+    }
+
     CrossProfileIntentFilter(XmlPullParser parser) throws XmlPullParserException, IOException {
-        String targetUserIdString = parser.getAttributeValue(null, ATTR_TARGET_USER_ID);
-        if (targetUserIdString == null) {
-            String msg = "Missing element under " + TAG +": " + ATTR_TARGET_USER_ID + " at " +
-                    parser.getPositionDescription();
-            PackageManagerService.reportSettingsProblem(Log.WARN, msg);
-            mTargetUserId = UserHandle.USER_NULL;
-        } else {
-            mTargetUserId = Integer.parseInt(targetUserIdString);
-        }
-        String flagsString = parser.getAttributeValue(null, ATTR_FLAGS);
-        if (flagsString == null) {
-            String msg = "Missing element under " + TAG +": " + ATTR_FLAGS + " at " +
-                    parser.getPositionDescription();
-            PackageManagerService.reportSettingsProblem(Log.WARN, msg);
-            mFlags = 0;
-        } else {
-            mFlags = Integer.parseInt(flagsString);
-        }
+        mTargetUserId = getIntFromXml(parser, ATTR_TARGET_USER_ID, UserHandle.USER_NULL);
+        mOwnerUserId = getIntFromXml(parser, ATTR_OWNER_USER_ID, UserHandle.USER_NULL);
+        mOwnerPackage = getStringFromXml(parser, ATTR_OWNER_PACKAGE, "");
+        mFlags = getIntFromXml(parser, ATTR_FLAGS, 0);
+
         int outerDepth = parser.getDepth();
         String tagName = parser.getName();
         int type;
@@ -103,9 +105,31 @@
         }
     }
 
+    String getStringFromXml(XmlPullParser parser, String attribute, String defaultValue) {
+        String value = parser.getAttributeValue(null, attribute);
+        if (value == null) {
+            String msg = "Missing element under " + TAG +": " + attribute + " at " +
+                    parser.getPositionDescription();
+            PackageManagerService.reportSettingsProblem(Log.WARN, msg);
+            return defaultValue;
+        } else {
+            return value;
+        }
+    }
+
+    int getIntFromXml(XmlPullParser parser, String attribute, int defaultValue) {
+        String stringValue = getStringFromXml(parser, attribute, null);
+        if (stringValue != null) {
+            return Integer.parseInt(stringValue);
+        }
+        return defaultValue;
+    }
+
     public void writeToXml(XmlSerializer serializer) throws IOException {
         serializer.attribute(null, ATTR_TARGET_USER_ID, Integer.toString(mTargetUserId));
         serializer.attribute(null, ATTR_FLAGS, Integer.toString(mFlags));
+        serializer.attribute(null, ATTR_OWNER_USER_ID, Integer.toString(mOwnerUserId));
+        serializer.attribute(null, ATTR_OWNER_PACKAGE, mOwnerPackage);
         serializer.startTag(null, ATTR_FILTER);
             super.writeToXml(serializer);
         serializer.endTag(null, ATTR_FILTER);
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index a07eb7e..68ae6ff 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -11635,22 +11635,25 @@
     }
 
     @Override
-    public void addCrossProfileIntentFilter(IntentFilter intentFilter, int sourceUserId,
-            int targetUserId, int flags) {
+    public void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage,
+            int ownerUserId, int sourceUserId, int targetUserId, int flags) {
         mContext.enforceCallingOrSelfPermission(
                         android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+        int callingUid = Binder.getCallingUid();
+        enforceOwnerRights(ownerPackage, ownerUserId, callingUid);
         if (intentFilter.countActions() == 0) {
             Slog.w(TAG, "Cannot set a crossProfile intent filter with no filter actions");
             return;
         }
         synchronized (mPackages) {
             CrossProfileIntentFilter filter = new CrossProfileIntentFilter(intentFilter,
-                    targetUserId, flags);
+                    ownerPackage, UserHandle.getUserId(callingUid), targetUserId, flags);
             mSettings.editCrossProfileIntentResolverLPw(sourceUserId).addFilter(filter);
             mSettings.writePackageRestrictionsLPr(sourceUserId);
         }
     }
 
+    @Override
     public void addCrossProfileIntentsForPackage(String packageName,
             int sourceUserId, int targetUserId) {
         mContext.enforceCallingOrSelfPermission(
@@ -11668,16 +11671,21 @@
     }
 
     @Override
-    public void clearCrossProfileIntentFilters(int sourceUserId) {
+    public void clearCrossProfileIntentFilters(int sourceUserId, String ownerPackage,
+            int ownerUserId) {
         mContext.enforceCallingOrSelfPermission(
                         android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
+        int callingUid = Binder.getCallingUid();
+        enforceOwnerRights(ownerPackage, ownerUserId, callingUid);
+        int callingUserId = UserHandle.getUserId(callingUid);
         synchronized (mPackages) {
             CrossProfileIntentResolver resolver =
                     mSettings.editCrossProfileIntentResolverLPw(sourceUserId);
             HashSet<CrossProfileIntentFilter> set =
                     new HashSet<CrossProfileIntentFilter>(resolver.filterSet());
             for (CrossProfileIntentFilter filter : set) {
-                if ((filter.getFlags() & PackageManager.SET_BY_PROFILE_OWNER) != 0) {
+                if (filter.getOwnerPackage().equals(ownerPackage)
+                        && filter.getOwnerUserId() == callingUserId) {
                     resolver.removeFilter(filter);
                 }
             }
@@ -11685,6 +11693,29 @@
         }
     }
 
+    // Enforcing that callingUid is owning pkg on userId
+    private void enforceOwnerRights(String pkg, int userId, int callingUid) {
+        // The system owns everything.
+        if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
+            return;
+        }
+        int callingUserId = UserHandle.getUserId(callingUid);
+        if (callingUserId != userId) {
+            throw new SecurityException("calling uid " + callingUid
+                    + " pretends to own " + pkg + " on user " + userId + " but belongs to user "
+                    + callingUserId);
+        }
+        PackageInfo pi = getPackageInfo(pkg, 0, callingUserId);
+        if (pi == null) {
+            throw new IllegalArgumentException("Unknown package " + pkg + " on user "
+                    + callingUserId);
+        }
+        if (!UserHandle.isSameApp(pi.applicationInfo.uid, callingUid)) {
+            throw new SecurityException("Calling uid " + callingUid
+                    + " does not own package " + pkg);
+        }
+    }
+
     @Override
     public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
         Intent intent = new Intent(Intent.ACTION_MAIN);
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index dc44e51..463f763 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -18,9 +18,7 @@
 
 import com.android.server.notification.NotificationDelegate;
 
-import android.os.IBinder;
-import android.service.notification.StatusBarNotification;
-
 public interface StatusBarManagerInternal {
     void setNotificationDelegate(NotificationDelegate delegate);
+    void buzzBeepBlinked();
 }
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index e548fa5..d0013aa 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -111,6 +111,15 @@
         public void setNotificationDelegate(NotificationDelegate delegate) {
             mNotificationDelegate = delegate;
         }
+        @Override
+        public void buzzBeepBlinked() {
+            if (mBar != null) {
+                try {
+                    mBar.buzzBeepBlinked();
+                } catch (RemoteException ex) {
+                }
+            }
+        }
     };
 
     // ================================================================================
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 6f72b94..14436aa 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -372,7 +372,7 @@
     private void removeListener(ITrustListener listener) {
         for (int i = 0; i < mTrustListeners.size(); i++) {
             if (mTrustListeners.get(i).asBinder() == listener.asBinder()) {
-                mTrustListeners.get(i);
+                mTrustListeners.remove(i);
                 return;
             }
         }
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index c97ed82..1a9a85c 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -745,7 +745,7 @@
     private void setStateLocked(String inputId, int state, int userId) {
         UserState userState = getUserStateLocked(userId);
         TvInputState inputState = userState.inputMap.get(inputId);
-        ServiceState serviceState = userState.serviceStateMap.get(inputId);
+        ServiceState serviceState = userState.serviceStateMap.get(inputState.mInfo.getComponent());
         int oldState = inputState.mState;
         inputState.mState = state;
         if (serviceState != null && serviceState.mService == null
diff --git a/services/core/jni/Android.mk b/services/core/jni/Android.mk
index 5599760..9a4d900 100644
--- a/services/core/jni/Android.mk
+++ b/services/core/jni/Android.mk
@@ -10,7 +10,6 @@
     $(LOCAL_REL_DIR)/com_android_server_AssetAtlasService.cpp \
     $(LOCAL_REL_DIR)/com_android_server_connectivity_Vpn.cpp \
     $(LOCAL_REL_DIR)/com_android_server_ConsumerIrService.cpp \
-    $(LOCAL_REL_DIR)/com_android_server_dreams_McuHal.cpp \
     $(LOCAL_REL_DIR)/com_android_server_hdmi_HdmiCecController.cpp \
     $(LOCAL_REL_DIR)/com_android_server_hdmi_HdmiMhlController.cpp \
     $(LOCAL_REL_DIR)/com_android_server_input_InputApplicationHandle.cpp \
diff --git a/services/core/jni/com_android_server_dreams_McuHal.cpp b/services/core/jni/com_android_server_dreams_McuHal.cpp
deleted file mode 100644
index a6d9297..0000000
--- a/services/core/jni/com_android_server_dreams_McuHal.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright (C) 2014 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.
- */
-
-#define LOG_TAG "McuHal"
-
-//#define LOG_NDEBUG 0
-
-#include "JNIHelp.h"
-#include "jni.h"
-
-#include <ScopedUtfChars.h>
-#include <ScopedPrimitiveArray.h>
-
-#include <utils/Errors.h>
-#include <utils/Log.h>
-#include <hardware/mcu.h>
-
-namespace android {
-
-static jlong nativeOpen(JNIEnv* env, jclass clazz) {
-    mcu_module_t* module = NULL;
-    status_t err = hw_get_module(MCU_HARDWARE_MODULE_ID,
-            (hw_module_t const**)&module);
-    if (err) {
-        ALOGE("Couldn't load %s module (%s)", MCU_HARDWARE_MODULE_ID, strerror(-err));
-        return 0;
-    }
-
-    err = module->init(module);
-    if (err) {
-        ALOGE("Couldn't initialize %s module (%s)", MCU_HARDWARE_MODULE_ID, strerror(-err));
-        return 0;
-    }
-
-    return reinterpret_cast<jlong>(module);
-}
-
-static jbyteArray nativeSendMessage(JNIEnv* env, jclass clazz,
-        jlong ptr, jstring msgStr, jbyteArray argArray) {
-    mcu_module_t* module = reinterpret_cast<mcu_module_t*>(ptr);
-
-    ScopedUtfChars msg(env, msgStr);
-    ALOGV("Sending message %s to MCU", msg.c_str());
-
-    void* result = NULL;
-    size_t resultSize = 0;
-    status_t err;
-    if (argArray) {
-        ScopedByteArrayRO arg(env, argArray);
-        err = module->sendMessage(module, msg.c_str(), arg.get(), arg.size(),
-                &result, &resultSize);
-    } else {
-        err = module->sendMessage(module, msg.c_str(), NULL, 0, &result, &resultSize);
-    }
-    if (err) {
-        ALOGE("Couldn't send message to MCU (%s)", strerror(-err));
-        return NULL;
-    }
-
-    if (!result) {
-        return NULL;
-    }
-
-    jbyteArray resultArray = env->NewByteArray(resultSize);
-    if (resultArray) {
-        env->SetByteArrayRegion(resultArray, 0, resultSize, static_cast<jbyte*>(result));
-    }
-    free(result);
-    return resultArray;
-}
-
-static JNINativeMethod gMcuHalMethods[] = {
-    /* name, signature, funcPtr */
-    { "nativeOpen", "()J",
-            (void*) nativeOpen },
-    { "nativeSendMessage", "(JLjava/lang/String;[B)[B",
-            (void*) nativeSendMessage },
-};
-
-int register_android_server_dreams_McuHal(JNIEnv* env) {
-    int res = jniRegisterNativeMethods(env, "com/android/server/dreams/McuHal",
-            gMcuHalMethods, NELEM(gMcuHalMethods));
-    LOG_FATAL_IF(res < 0, "Unable to register native methods.");
-    return 0;
-}
-
-} /* namespace android */
diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp
index bf7501e..ce2ca9b 100644
--- a/services/core/jni/onload.cpp
+++ b/services/core/jni/onload.cpp
@@ -37,7 +37,6 @@
 int register_android_server_location_GpsLocationProvider(JNIEnv* env);
 int register_android_server_location_FlpHardwareProvider(JNIEnv* env);
 int register_android_server_connectivity_Vpn(JNIEnv* env);
-int register_android_server_dreams_McuHal(JNIEnv* env);
 int register_android_server_hdmi_HdmiCecController(JNIEnv* env);
 int register_android_server_hdmi_HdmiMhlController(JNIEnv* env);
 int register_android_server_tv_TvInputHal(JNIEnv* env);
@@ -73,7 +72,6 @@
     register_android_server_connectivity_Vpn(env);
     register_android_server_AssetAtlasService(env);
     register_android_server_ConsumerIrService(env);
-    register_android_server_dreams_McuHal(env);
     register_android_server_BatteryStatsService(env);
     register_android_server_hdmi_HdmiCecController(env);
     register_android_server_hdmi_HdmiMhlController(env);
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index dc55e6d..25f9e9b 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -252,8 +252,6 @@
         }
     };
 
-    private IAppOpsService mAppOpsService;
-
     static class ActiveAdmin {
         private static final String TAG_DISABLE_KEYGUARD_FEATURES = "disable-keyguard-features";
         private static final String TAG_DISABLE_CAMERA = "disable-camera";
@@ -1288,24 +1286,6 @@
         getUserData(UserHandle.USER_OWNER);
         loadDeviceOwner();
         cleanUpOldUsers();
-        mAppOpsService = IAppOpsService.Stub.asInterface(
-                ServiceManager.getService(Context.APP_OPS_SERVICE));
-        if (mDeviceOwner != null) {
-            if (mDeviceOwner.hasDeviceOwner()) {
-                try {
-                    mAppOpsService.setDeviceOwner(mDeviceOwner.getDeviceOwnerPackageName());
-                } catch (RemoteException e) {
-                    Log.w(LOG_TAG, "Unable to notify AppOpsService of DeviceOwner", e);
-                }
-            }
-            for (Integer i : mDeviceOwner.getProfileOwnerKeys()) {
-                try {
-                    mAppOpsService.setProfileOwner(mDeviceOwner.getProfileOwnerPackageName(i), i);
-                } catch (RemoteException e) {
-                    Log.w(LOG_TAG, "Unable to notify AppOpsService of ProfileOwner", e);
-                }
-            }
-        }
         // Register an observer for watching for user setup complete.
         new SetupContentObserver(mHandler).register(mContext.getContentResolver());
         // Initialize the user setup state, to handle the upgrade case.
@@ -3169,14 +3149,6 @@
                         "Trying to set device owner but device owner is already set.");
             }
 
-            long token = Binder.clearCallingIdentity();
-            try {
-                mAppOpsService.setDeviceOwner(packageName);
-            } catch (RemoteException e) {
-                Log.w(LOG_TAG, "Unable to notify AppOpsService of DeviceOwner", e);
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
             if (mDeviceOwner == null) {
                 // Device owner is not set and does not exist, set it.
                 mDeviceOwner = DeviceOwner.createWithDeviceOwner(packageName, ownerName);
@@ -3284,14 +3256,7 @@
                 throw new IllegalStateException(
                         "Trying to set profile owner but user is already set-up.");
             }
-            long token = Binder.clearCallingIdentity();
-            try {
-                mAppOpsService.setProfileOwner(packageName, userHandle);
-            } catch (RemoteException e) {
-                Log.w(LOG_TAG, "Unable to notify AppOpsService of ProfileOwner", e);
-            } finally {
-                Binder.restoreCallingIdentity(token);
-            }
+
             if (mDeviceOwner == null) {
                 // Device owner state does not exist, create it.
                 mDeviceOwner = DeviceOwner.createWithProfileOwner(packageName, ownerName,
@@ -3606,12 +3571,12 @@
             long id = Binder.clearCallingIdentity();
             try {
                 if ((flags & DevicePolicyManager.FLAG_PARENT_CAN_ACCESS_MANAGED) != 0) {
-                    pm.addCrossProfileIntentFilter(filter, callingUserId, UserHandle.USER_OWNER,
-                            PackageManager.SET_BY_PROFILE_OWNER);
+                    pm.addCrossProfileIntentFilter(filter, who.getPackageName(),
+                            mContext.getUserId(), callingUserId, UserHandle.USER_OWNER, 0);
                 }
                 if ((flags & DevicePolicyManager.FLAG_MANAGED_CAN_ACCESS_PARENT) != 0) {
-                    pm.addCrossProfileIntentFilter(filter, UserHandle.USER_OWNER, callingUserId,
-                            PackageManager.SET_BY_PROFILE_OWNER);
+                    pm.addCrossProfileIntentFilter(filter, who.getPackageName(),
+                            mContext.getUserId(), UserHandle.USER_OWNER, callingUserId, 0);
                 }
             } catch (RemoteException re) {
                 // Shouldn't happen
@@ -3631,10 +3596,12 @@
             IPackageManager pm = AppGlobals.getPackageManager();
             long id = Binder.clearCallingIdentity();
             try {
-                pm.clearCrossProfileIntentFilters(callingUserId);
+                pm.clearCrossProfileIntentFilters(callingUserId, who.getPackageName(),
+                        callingUserId);
                 // If we want to support multiple managed profiles, we will have to only remove
                 // those that have callingUserId as their target.
-                pm.clearCrossProfileIntentFilters(UserHandle.USER_OWNER);
+                pm.clearCrossProfileIntentFilters(UserHandle.USER_OWNER, who.getPackageName(),
+                        callingUserId);
             } catch (RemoteException re) {
                 // Shouldn't happen
             } finally {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 0cc6e0f..70266ee 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -673,6 +673,8 @@
                 mSystemServiceManager.startService(
                             "com.android.server.wifi.WifiScanningService");
 
+                mSystemServiceManager.startService("com.android.server.wifi.RttService");
+
                 if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_ETHERNET)) {
                     mSystemServiceManager.startService(ETHERNET_SERVICE_CLASS);
                 }
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java
index 1e0d6de..8913eb9 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/DatabaseHelper.java
@@ -28,8 +28,6 @@
 import android.text.TextUtils;
 import android.util.Slog;
 
-import java.util.ArrayList;
-import java.util.List;
 import java.util.UUID;
 
 /**
@@ -39,43 +37,35 @@
  */
 public class DatabaseHelper extends SQLiteOpenHelper {
     static final String TAG = "SoundModelDBHelper";
-    static final boolean DBG = false;
+    // TODO: Set to false.
+    static final boolean DBG = true;
 
     private static final String NAME = "sound_model.db";
-    private static final int VERSION = 2;
-
-    public static interface KeyphraseContract {
-        public static final String TABLE = "keyphrase";
-        public static final String KEY_ID = "_id";
-        public static final String KEY_RECOGNITION_MODES = "modes";
-        public static final String KEY_LOCALE = "locale";
-        public static final String KEY_HINT_TEXT = "hint_text";
-        public static final String KEY_USERS = "users";
-        public static final String KEY_SOUND_MODEL_ID = "sound_model_id";
-    }
+    private static final int VERSION = 3;
 
     public static interface SoundModelContract {
         public static final String TABLE = "sound_model";
-        public static final String KEY_ID = "_id";
+        public static final String KEY_KEYPHRASE_ID = "keyphrase_id";
+        public static final String KEY_MODEL_UUID = "model_uuid";
         public static final String KEY_TYPE = "type";
         public static final String KEY_DATA = "data";
+        public static final String KEY_RECOGNITION_MODES = "recognition_modes";
+        public static final String KEY_LOCALE = "locale";
+        public static final String KEY_HINT_TEXT = "hint_text";
+        public static final String KEY_USERS = "users";
     }
 
-    // Table Create Statements
-    private static final String CREATE_TABLE_KEYPRHASES = "CREATE TABLE "
-            + KeyphraseContract.TABLE + "("
-            + KeyphraseContract.KEY_ID + " INTEGER PRIMARY KEY,"
-            + KeyphraseContract.KEY_RECOGNITION_MODES + " INTEGER,"
-            + KeyphraseContract.KEY_USERS + " TEXT,"
-            + KeyphraseContract.KEY_SOUND_MODEL_ID + " TEXT,"
-            + KeyphraseContract.KEY_LOCALE + " TEXT,"
-            + KeyphraseContract.KEY_HINT_TEXT + " TEXT" + ")";
-
+    // Table Create Statement
     private static final String CREATE_TABLE_SOUND_MODEL = "CREATE TABLE "
             + SoundModelContract.TABLE + "("
-            + SoundModelContract.KEY_ID + " TEXT PRIMARY KEY,"
+            + SoundModelContract.KEY_KEYPHRASE_ID + " INTEGER PRIMARY KEY,"
+            + SoundModelContract.KEY_MODEL_UUID + " TEXT,"
             + SoundModelContract.KEY_TYPE + " INTEGER,"
-            + SoundModelContract.KEY_DATA + " BLOB" + ")";
+            + SoundModelContract.KEY_DATA + " BLOB,"
+            + SoundModelContract.KEY_RECOGNITION_MODES + " INTEGER,"
+            + SoundModelContract.KEY_LOCALE + " TEXT,"
+            + SoundModelContract.KEY_HINT_TEXT + " TEXT,"
+            + SoundModelContract.KEY_USERS + " TEXT" + ")";
 
     private final UserManager mUserManager;
 
@@ -87,57 +77,44 @@
     @Override
     public void onCreate(SQLiteDatabase db) {
         // creating required tables
-        db.execSQL(CREATE_TABLE_KEYPRHASES);
         db.execSQL(CREATE_TABLE_SOUND_MODEL);
     }
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         // TODO: For now, drop older tables and recreate new ones.
-        db.execSQL("DROP TABLE IF EXISTS " + KeyphraseContract.TABLE);
         db.execSQL("DROP TABLE IF EXISTS " + SoundModelContract.TABLE);
         onCreate(db);
     }
 
-    public boolean addOrUpdateKeyphraseSoundModel(KeyphraseSoundModel soundModel) {
+    /**
+     * Updates the given keyphrase model, adds it, if it doesn't already exist.
+     *
+     * TODO: We only support one keyphrase currently.
+     */
+    public boolean updateKeyphraseSoundModel(KeyphraseSoundModel soundModel) {
         synchronized(this) {
             SQLiteDatabase db = getWritableDatabase();
             ContentValues values = new ContentValues();
-            // Generate a random ID for the model.
-            values.put(SoundModelContract.KEY_ID, soundModel.uuid.toString());
-            values.put(SoundModelContract.KEY_DATA, soundModel.data);
+            values.put(SoundModelContract.KEY_MODEL_UUID, soundModel.uuid.toString());
             values.put(SoundModelContract.KEY_TYPE, SoundTrigger.SoundModel.TYPE_KEYPHRASE);
-    
-            boolean status = true;
-            if (db.insertWithOnConflict(SoundModelContract.TABLE, null, values,
-                    SQLiteDatabase.CONFLICT_REPLACE) != -1) {
-                for (Keyphrase keyphrase : soundModel.keyphrases) {
-                    status &= addOrUpdateKeyphraseLocked(db, soundModel.uuid, keyphrase);
-                }
-                db.close();
-                return status;
-            } else {
-                Slog.w(TAG, "Failed to persist sound model to database");
-                db.close();
-                return false;
-            }
-        }
-    }
+            values.put(SoundModelContract.KEY_DATA, soundModel.data);
 
-    private boolean addOrUpdateKeyphraseLocked(
-            SQLiteDatabase db, UUID modelId, Keyphrase keyphrase) {
-        ContentValues values = new ContentValues();
-        values.put(KeyphraseContract.KEY_ID, keyphrase.id);
-        values.put(KeyphraseContract.KEY_RECOGNITION_MODES, keyphrase.recognitionModes);
-        values.put(KeyphraseContract.KEY_SOUND_MODEL_ID, modelId.toString());
-        values.put(KeyphraseContract.KEY_HINT_TEXT, keyphrase.text);
-        values.put(KeyphraseContract.KEY_LOCALE, keyphrase.locale);
-        values.put(KeyphraseContract.KEY_USERS, getCommaSeparatedString(keyphrase.users));
-        if (db.insertWithOnConflict(
-                KeyphraseContract.TABLE, null, values, SQLiteDatabase.CONFLICT_REPLACE) != -1) {
-            return true;
-        } else {
-            Slog.w(TAG, "Failed to persist keyphrase to database");
+            if (soundModel.keyphrases != null && soundModel.keyphrases.length == 1) {
+                values.put(SoundModelContract.KEY_KEYPHRASE_ID, soundModel.keyphrases[0].id);
+                values.put(SoundModelContract.KEY_RECOGNITION_MODES,
+                        soundModel.keyphrases[0].recognitionModes);
+                values.put(SoundModelContract.KEY_USERS,
+                        getCommaSeparatedString(soundModel.keyphrases[0].users));
+                values.put(SoundModelContract.KEY_LOCALE, soundModel.keyphrases[0].locale);
+                values.put(SoundModelContract.KEY_HINT_TEXT, soundModel.keyphrases[0].text);
+                try {
+                    return db.insertWithOnConflict(SoundModelContract.TABLE, null, values,
+                            SQLiteDatabase.CONFLICT_REPLACE) != -1;
+                } finally {
+                    db.close();
+                }
+            }
             return false;
         }
     }
@@ -145,111 +122,90 @@
     /**
      * Deletes the sound model and associated keyphrases.
      */
-    public boolean deleteKeyphraseSoundModel(UUID uuid) {
+    public boolean deleteKeyphraseSoundModel(int keyphraseId) {
         synchronized(this) {
             SQLiteDatabase db = getWritableDatabase();
-            String modelId = uuid.toString();
-            String soundModelClause = SoundModelContract.KEY_ID + "=" + modelId;
-            boolean status = true;
-            if (db.delete(SoundModelContract.TABLE, soundModelClause, null) == 0) {
-                Slog.w(TAG, "No sound models deleted from the database");
-                status = false;
+            String soundModelClause = SoundModelContract.KEY_KEYPHRASE_ID + "=" + keyphraseId;
+
+            try {
+                return db.delete(SoundModelContract.TABLE, soundModelClause, null) != 0;
+            } finally {
+                db.close();
             }
-            String keyphraseClause = KeyphraseContract.KEY_SOUND_MODEL_ID + "=" + modelId;
-            if (db.delete(KeyphraseContract.TABLE, keyphraseClause, null) == 0) {
-                Slog.w(TAG, "No keyphrases deleted from the database");
-                status = false;
-            }
-            db.close();
-            return status;
         }
     }
 
     /**
-     * Lists all the keyphrase sound models currently registered with the system.
+     * Returns a matching {@link KeyphraseSoundModel} for the keyphrase ID.
+     * Returns null if a match isn't found.
+     *
+     * TODO: We only support one keyphrase currently.
      */
-    public List<KeyphraseSoundModel> getKephraseSoundModels() {
+    public KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId) {
         synchronized(this) {
-            List<KeyphraseSoundModel> models = new ArrayList<>();
-            String selectQuery = "SELECT  * FROM " + SoundModelContract.TABLE;
+            // Find the corresponding sound model ID for the keyphrase.
+            String selectQuery = "SELECT  * FROM " + SoundModelContract.TABLE
+                    + " WHERE " + SoundModelContract.KEY_KEYPHRASE_ID + " = '" + keyphraseId + "'";
             SQLiteDatabase db = getReadableDatabase();
             Cursor c = db.rawQuery(selectQuery, null);
-    
-            // looping through all rows and adding to list
-            if (c.moveToFirst()) {
-                do {
+
+            try {
+                if (c.moveToFirst()) {
                     int type = c.getInt(c.getColumnIndex(SoundModelContract.KEY_TYPE));
                     if (type != SoundTrigger.SoundModel.TYPE_KEYPHRASE) {
-                        // Ignore non-keyphrase sound models.
-                        continue;
+                        Slog.w(TAG, "No KeyphraseSoundModel available for the given keyphrase");
+                        return null;
                     }
-                    String id = c.getString(c.getColumnIndex(SoundModelContract.KEY_ID));
-                    byte[] data = c.getBlob(c.getColumnIndex(SoundModelContract.KEY_DATA));
-                    // Get all the keyphrases for this this sound model.
-                    // Validate the sound model.
-                    if (id == null) {
+
+                    String modelUuid = c.getString(
+                            c.getColumnIndex(SoundModelContract.KEY_MODEL_UUID));
+                    if (modelUuid == null) {
                         Slog.w(TAG, "Ignoring sound model since it doesn't specify an ID");
-                        continue;
+                        return null;
                     }
-                    KeyphraseSoundModel model = new KeyphraseSoundModel(
-                            UUID.fromString(id), data, getKeyphrasesForSoundModelLocked(db, id));
-                    if (DBG) {
-                        Slog.d(TAG, "Adding model: " + model);
+
+                    byte[] data = c.getBlob(c.getColumnIndex(SoundModelContract.KEY_DATA));
+                    int recognitionModes = c.getInt(
+                            c.getColumnIndex(SoundModelContract.KEY_RECOGNITION_MODES));
+                    int[] users = getArrayForCommaSeparatedString(
+                            c.getString(c.getColumnIndex(SoundModelContract.KEY_USERS)));
+                    String locale = c.getString(c.getColumnIndex(SoundModelContract.KEY_LOCALE));
+                    String text = c.getString(
+                            c.getColumnIndex(SoundModelContract.KEY_HINT_TEXT));
+
+                    // Only add keyphrases meant for the current user.
+                    if (users == null) {
+                        // No users present in the keyphrase.
+                        Slog.w(TAG, "Ignoring keyphrase since it doesn't specify users");
+                        return null;
                     }
-                    models.add(model);
-                } while (c.moveToNext());
+                    boolean isAvailableForCurrentUser = false;
+                    int currentUser = mUserManager.getUserHandle();
+                    for (int user : users) {
+                        if (currentUser == user) {
+                            isAvailableForCurrentUser = true;
+                            break;
+                        }
+                    }
+                    if (!isAvailableForCurrentUser) {
+                        Slog.w(TAG, "Ignoring keyphrase since it's not for the current user");
+                        return null;
+                    }
+
+                    Keyphrase[] keyphrases = new Keyphrase[1];
+                    keyphrases[0] = new Keyphrase(
+                            keyphraseId, recognitionModes, locale, text, users);
+                    return new KeyphraseSoundModel(UUID.fromString(modelUuid), data, keyphrases);
+                }
+                Slog.w(TAG, "No SoundModel available for the given keyphrase");
+            } finally {
+                c.close();
+                db.close();
             }
-            c.close();
-            db.close();
-            return models;
+            return null;
         }
     }
 
-    private Keyphrase[] getKeyphrasesForSoundModelLocked(SQLiteDatabase db, String modelId) {
-        List<Keyphrase> keyphrases = new ArrayList<>();
-        String selectQuery = "SELECT  * FROM " + KeyphraseContract.TABLE
-                + " WHERE " + KeyphraseContract.KEY_SOUND_MODEL_ID + " = '" + modelId + "'";
-        Cursor c = db.rawQuery(selectQuery, null);
-
-        // looping through all rows and adding to list
-        if (c.moveToFirst()) {
-            do {
-                int id = c.getInt(c.getColumnIndex(KeyphraseContract.KEY_ID));
-                int modes = c.getInt(c.getColumnIndex(KeyphraseContract.KEY_RECOGNITION_MODES));
-                int[] users = getArrayForCommaSeparatedString(
-                        c.getString(c.getColumnIndex(KeyphraseContract.KEY_USERS)));
-                String locale = c.getString(c.getColumnIndex(KeyphraseContract.KEY_LOCALE));
-                String hintText = c.getString(c.getColumnIndex(KeyphraseContract.KEY_HINT_TEXT));
-
-                // Only add keyphrases meant for the current user.
-                if (users == null) {
-                    // No users present in the keyphrase.
-                    Slog.w(TAG, "Ignoring keyphrase since it doesn't specify users");
-                    continue;
-                }
-                boolean isAvailableForCurrentUser = false;
-                int currentUser = mUserManager.getUserHandle();
-                for (int user : users) {
-                    if (currentUser == user) {
-                        isAvailableForCurrentUser = true;
-                        break;
-                    }
-                }
-                if (!isAvailableForCurrentUser) {
-                    Slog.w(TAG, "Ignoring keyphrase since it's not for the current user");
-                    continue;
-                }
-
-                keyphrases.add(new Keyphrase(id, modes, locale, hintText, users));
-            } while (c.moveToNext());
-        }
-        Keyphrase[] keyphraseArr = new Keyphrase[keyphrases.size()];
-        keyphrases.toArray(keyphraseArr);
-        c.close();
-        return keyphraseArr;
-    }
-
-
     private static String getCommaSeparatedString(int[] users) {
         if (users == null || users.length == 0) {
             return "";
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
index 4430586..86dca79 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
@@ -38,7 +38,8 @@
  */
 public class SoundTriggerHelper implements SoundTrigger.StatusListener {
     static final String TAG = "SoundTriggerHelper";
-    static final boolean DBG = false;
+    // TODO: Set to false.
+    static final boolean DBG = true;
     // TODO: Remove this.
     static final int TEMP_KEYPHRASE_ID = 100;
 
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index 5d9e107..a3d578a 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -50,6 +50,7 @@
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 import java.util.List;
+import java.util.UUID;
 
 
 /**
@@ -243,34 +244,18 @@
         //----------------- Model management APIs --------------------------------//
 
         @Override
-        public List<KeyphraseSoundModel> listRegisteredKeyphraseSoundModels(
-                IVoiceInteractionService service) {
-            // Allow the call if this is the current voice interaction service
-            // or the caller holds the MANAGE_VOICE_KEYPHRASES permission.
+        public KeyphraseSoundModel getKeyphraseSoundModel(int keyphraseId) {
             synchronized (this) {
-                boolean permissionGranted =
-                        mContext.checkCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES)
-                        == PackageManager.PERMISSION_GRANTED;
-                boolean currentVoiceInteractionService = service != null
-                        && mImpl != null
-                        && mImpl.mService != null
-                        && service.asBinder() == mImpl.mService.asBinder();
-
-                if (!permissionGranted && !currentVoiceInteractionService) {
-                    if (!currentVoiceInteractionService) {
-                        throw new SecurityException(
-                                "Caller is not the current voice interaction service");
-                    }
-                    if (!permissionGranted) {
-                        throw new SecurityException("Caller does not hold the permission "
-                                + Manifest.permission.MANAGE_VOICE_KEYPHRASES);
-                    }
+                if (mContext.checkCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES)
+                        != PackageManager.PERMISSION_GRANTED) {
+                    throw new SecurityException("Caller does not hold the permission "
+                            + Manifest.permission.MANAGE_VOICE_KEYPHRASES);
                 }
             }
 
             final long caller = Binder.clearCallingIdentity();
             try {
-                return mDbHelper.getKephraseSoundModels();
+                return mDbHelper.getKeyphraseSoundModel(keyphraseId);
             } finally {
                 Binder.restoreCallingIdentity(caller);
             }
@@ -291,15 +276,35 @@
 
             final long caller = Binder.clearCallingIdentity();
             try {
-                boolean success = false;
-                if (model.keyphrases == null) {
-                    // If the keyphrases are not present in the model, delete the model.
-                    success = mDbHelper.deleteKeyphraseSoundModel(model.uuid);
+                if (mDbHelper.updateKeyphraseSoundModel(model)) {
+                    synchronized (this) {
+                        // Notify the voice interaction service of a change in sound models.
+                        if (mImpl != null && mImpl.mService != null) {
+                            mImpl.notifySoundModelsChangedLocked();
+                        }
+                    }
+                    return SoundTriggerHelper.STATUS_OK;
                 } else {
-                    // Else update the model.
-                    success = mDbHelper.addOrUpdateKeyphraseSoundModel(model);
+                    return SoundTriggerHelper.STATUS_ERROR;
                 }
-                if (success) {
+            } finally {
+                Binder.restoreCallingIdentity(caller);
+            }
+        }
+
+        @Override
+        public int deleteKeyphraseSoundModel(int keyphraseId) {
+            synchronized (this) {
+                if (mContext.checkCallingPermission(Manifest.permission.MANAGE_VOICE_KEYPHRASES)
+                        != PackageManager.PERMISSION_GRANTED) {
+                    throw new SecurityException("Caller does not hold the permission "
+                            + Manifest.permission.MANAGE_VOICE_KEYPHRASES);
+                }
+            }
+
+            final long caller = Binder.clearCallingIdentity();
+            try {
+                if (mDbHelper.deleteKeyphraseSoundModel(keyphraseId)) {
                     synchronized (this) {
                         // Notify the voice interaction service of a change in sound models.
                         if (mImpl != null && mImpl.mService != null) {
@@ -317,6 +322,25 @@
 
         //----------------- SoundTrigger APIs --------------------------------//
         @Override
+        public boolean isEnrolledForKeyphrase(IVoiceInteractionService service, int keyphraseId) {
+            synchronized (this) {
+                if (mImpl == null || mImpl.mService == null
+                        || service.asBinder() != mImpl.mService.asBinder()) {
+                    throw new SecurityException(
+                            "Caller is not the current voice interaction service");
+                }
+            }
+
+            final long caller = Binder.clearCallingIdentity();
+            try {
+                KeyphraseSoundModel model = mDbHelper.getKeyphraseSoundModel(keyphraseId);
+                return model != null;
+            } finally {
+                Binder.restoreCallingIdentity(caller);
+            }
+        }
+
+        @Override
         public ModuleProperties getDspModuleProperties(IVoiceInteractionService service) {
             // Allow the call if this is the current voice interaction service.
             synchronized (this) {
@@ -337,8 +361,7 @@
 
         @Override
         public int startRecognition(IVoiceInteractionService service, int keyphraseId,
-                KeyphraseSoundModel soundModel, IRecognitionStatusCallback callback,
-                RecognitionConfig recognitionConfig) {
+                IRecognitionStatusCallback callback, RecognitionConfig recognitionConfig) {
             // Allow the call if this is the current voice interaction service.
             synchronized (this) {
                 if (mImpl == null || mImpl.mService == null
@@ -347,13 +370,25 @@
                             "Caller is not the current voice interaction service");
                 }
 
-                final long caller = Binder.clearCallingIdentity();
-                try {
+                if (callback == null || recognitionConfig == null) {
+                    throw new IllegalArgumentException("Illegal argument(s) in startRecognition");
+                }
+            }
+
+            final long caller = Binder.clearCallingIdentity();
+            try {
+                KeyphraseSoundModel soundModel = mDbHelper.getKeyphraseSoundModel(keyphraseId);
+                if (soundModel == null
+                        || soundModel.uuid == null
+                        || soundModel.keyphrases == null) {
+                    Slog.w(TAG, "No matching sound model found in startRecognition");
+                    return SoundTriggerHelper.STATUS_ERROR;
+                } else {
                     return mSoundTriggerHelper.startRecognition(
                             keyphraseId, soundModel, callback, recognitionConfig);
-                } finally {
-                    Binder.restoreCallingIdentity(caller);
                 }
+            } finally {
+                Binder.restoreCallingIdentity(caller);
             }
         }
 
@@ -367,13 +402,13 @@
                     throw new SecurityException(
                             "Caller is not the current voice interaction service");
                 }
+            }
 
-                final long caller = Binder.clearCallingIdentity();
-                try {
-                    return mSoundTriggerHelper.stopRecognition(keyphraseId, callback);
-                } finally {
-                    Binder.restoreCallingIdentity(caller);
-                }
+            final long caller = Binder.clearCallingIdentity();
+            try {
+                return mSoundTriggerHelper.stopRecognition(keyphraseId, callback);
+            } finally {
+                Binder.restoreCallingIdentity(caller);
             }
         }
 
diff --git a/telecomm/java/android/telecomm/Connection.java b/telecomm/java/android/telecomm/Connection.java
index 6043232..322dafe 100644
--- a/telecomm/java/android/telecomm/Connection.java
+++ b/telecomm/java/android/telecomm/Connection.java
@@ -44,7 +44,8 @@
         public void onDestroyed(Connection c) {}
         public void onCallCapabilitiesChanged(Connection c, int callCapabilities) {}
         public void onParentConnectionChanged(Connection c, Connection parent) {}
-        public void onVideoCallProviderChanged(Connection c, VideoCallProvider videoCallProvider) {}
+        public void onVideoCallProviderChanged(
+                Connection c, ConnectionService.VideoCallProvider videoCallProvider) {}
         public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
         public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
         public void onStartActivityFromInCall(Connection c, PendingIntent intent) {}
@@ -78,7 +79,7 @@
     private boolean mRequestingRingback = false;
     private int mCallCapabilities;
     private Connection mParentConnection;
-    private VideoCallProvider mVideoCallProvider;
+    private ConnectionService.VideoCallProvider mVideoCallProvider;
     private boolean mAudioModeIsVoip;
     private StatusHints mStatusHints;
     private int mVideoState;
@@ -417,14 +418,14 @@
      * Sets the video call provider.
      * @param videoCallProvider The video call provider.
      */
-    public final void setVideoCallProvider(VideoCallProvider videoCallProvider) {
+    public final void setVideoCallProvider(ConnectionService.VideoCallProvider videoCallProvider) {
         mVideoCallProvider = videoCallProvider;
         for (Listener l : mListeners) {
             l.onVideoCallProviderChanged(this, videoCallProvider);
         }
     }
 
-    public final VideoCallProvider getVideoCallProvider() {
+    public final ConnectionService.VideoCallProvider getVideoCallProvider() {
         return mVideoCallProvider;
     }
 
diff --git a/telecomm/java/android/telecomm/ConnectionService.java b/telecomm/java/android/telecomm/ConnectionService.java
index 51876df..cefa929 100644
--- a/telecomm/java/android/telecomm/ConnectionService.java
+++ b/telecomm/java/android/telecomm/ConnectionService.java
@@ -29,9 +29,14 @@
 import android.os.Looper;
 import android.os.Message;
 import android.telephony.DisconnectCause;
+import android.os.RemoteException;
+import android.view.Surface;
+
 import com.android.internal.os.SomeArgs;
 import com.android.internal.telecomm.IConnectionService;
 import com.android.internal.telecomm.IConnectionServiceAdapter;
+import com.android.internal.telecomm.IVideoCallCallback;
+import com.android.internal.telecomm.IVideoCallProvider;
 import com.android.internal.telecomm.RemoteServiceCallback;
 
 import java.util.Collection;
@@ -758,4 +763,312 @@
         Log.w(this, "%s - Cannot find Connection %s", action, callId);
         return NULL_CONNECTION;
     }
+
+    public static abstract class VideoCallProvider {
+        private static final int MSG_SET_VIDEO_CALL_LISTENER = 1;
+        private static final int MSG_SET_CAMERA = 2;
+        private static final int MSG_SET_PREVIEW_SURFACE = 3;
+        private static final int MSG_SET_DISPLAY_SURFACE = 4;
+        private static final int MSG_SET_DEVICE_ORIENTATION = 5;
+        private static final int MSG_SET_ZOOM = 6;
+        private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
+        private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
+        private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
+        private static final int MSG_REQUEST_CALL_DATA_USAGE = 10;
+        private static final int MSG_SET_PAUSE_IMAGE = 11;
+
+        private final VideoCallProviderHandler mMessageHandler = new VideoCallProviderHandler();
+        private final VideoCallProviderBinder mBinder;
+        private IVideoCallCallback mVideoCallListener;
+
+        /**
+         * Default handler used to consolidate binder method calls onto a single thread.
+         */
+        private final class VideoCallProviderHandler extends Handler {
+            @Override
+            public void handleMessage(Message msg) {
+                switch (msg.what) {
+                    case MSG_SET_VIDEO_CALL_LISTENER:
+                        mVideoCallListener = IVideoCallCallback.Stub.asInterface((IBinder) msg.obj);
+                        break;
+                    case MSG_SET_CAMERA:
+                        onSetCamera((String) msg.obj);
+                        break;
+                    case MSG_SET_PREVIEW_SURFACE:
+                        onSetPreviewSurface((Surface) msg.obj);
+                        break;
+                    case MSG_SET_DISPLAY_SURFACE:
+                        onSetDisplaySurface((Surface) msg.obj);
+                        break;
+                    case MSG_SET_DEVICE_ORIENTATION:
+                        onSetDeviceOrientation(msg.arg1);
+                        break;
+                    case MSG_SET_ZOOM:
+                        onSetZoom((Float) msg.obj);
+                        break;
+                    case MSG_SEND_SESSION_MODIFY_REQUEST:
+                        onSendSessionModifyRequest((VideoCallProfile) msg.obj);
+                        break;
+                    case MSG_SEND_SESSION_MODIFY_RESPONSE:
+                        onSendSessionModifyResponse((VideoCallProfile) msg.obj);
+                        break;
+                    case MSG_REQUEST_CAMERA_CAPABILITIES:
+                        onRequestCameraCapabilities();
+                        break;
+                    case MSG_REQUEST_CALL_DATA_USAGE:
+                        onRequestCallDataUsage();
+                        break;
+                    case MSG_SET_PAUSE_IMAGE:
+                        onSetPauseImage((String) msg.obj);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+
+        /**
+         * IVideoCallProvider stub implementation.
+         */
+        private final class VideoCallProviderBinder extends IVideoCallProvider.Stub {
+            public void setVideoCallListener(IBinder videoCallListenerBinder) {
+                mMessageHandler.obtainMessage(
+                        MSG_SET_VIDEO_CALL_LISTENER, videoCallListenerBinder).sendToTarget();
+            }
+
+            public void setCamera(String cameraId) {
+                mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
+            }
+
+            public void setPreviewSurface(Surface surface) {
+                mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
+            }
+
+            public void setDisplaySurface(Surface surface) {
+                mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
+            }
+
+            public void setDeviceOrientation(int rotation) {
+                mMessageHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation).sendToTarget();
+            }
+
+            public void setZoom(float value) {
+                mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
+            }
+
+            public void sendSessionModifyRequest(VideoCallProfile requestProfile) {
+                mMessageHandler.obtainMessage(
+                        MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
+            }
+
+            public void sendSessionModifyResponse(VideoCallProfile responseProfile) {
+                mMessageHandler.obtainMessage(
+                        MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
+            }
+
+            public void requestCameraCapabilities() {
+                mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
+            }
+
+            public void requestCallDataUsage() {
+                mMessageHandler.obtainMessage(MSG_REQUEST_CALL_DATA_USAGE).sendToTarget();
+            }
+
+            public void setPauseImage(String uri) {
+                mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
+            }
+        }
+
+        public VideoCallProvider() {
+            mBinder = new VideoCallProviderBinder();
+        }
+
+        /**
+         * Returns binder object which can be used across IPC methods.
+         * @hide
+         */
+        public final IVideoCallProvider getInterface() {
+            return mBinder;
+        }
+
+        /**
+         * Sets the camera to be used for video recording in a video call.
+         *
+         * @param cameraId The id of the camera.
+         */
+        public abstract void onSetCamera(String cameraId);
+
+        /**
+         * Sets the surface to be used for displaying a preview of what the user's camera is
+         * currently capturing.  When video transmission is enabled, this is the video signal which is
+         * sent to the remote device.
+         *
+         * @param surface The surface.
+         */
+        public abstract void onSetPreviewSurface(Surface surface);
+
+        /**
+         * Sets the surface to be used for displaying the video received from the remote device.
+         *
+         * @param surface The surface.
+         */
+        public abstract void onSetDisplaySurface(Surface surface);
+
+        /**
+         * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of the
+         * device is 0 degrees.
+         *
+         * @param rotation The device orientation, in degrees.
+         */
+        public abstract void onSetDeviceOrientation(int rotation);
+
+        /**
+         * Sets camera zoom ratio.
+         *
+         * @param value The camera zoom ratio.
+         */
+        public abstract void onSetZoom(float value);
+
+        /**
+         * Issues a request to modify the properties of the current session.  The request is sent to
+         * the remote device where it it handled by
+         * {@link InCallService.VideoCall.Listener#onSessionModifyRequestReceived}.
+         * Some examples of session modification requests: upgrade call from audio to video, downgrade
+         * call from video to audio, pause video.
+         *
+         * @param requestProfile The requested call video properties.
+         */
+        public abstract void onSendSessionModifyRequest(VideoCallProfile requestProfile);
+
+        /**te
+         * Provides a response to a request to change the current call session video
+         * properties.
+         * This is in response to a request the InCall UI has received via
+         * {@link InCallService.VideoCall.Listener#onSessionModifyRequestReceived}.
+         * The response is handled on the remove device by
+         * {@link InCallService.VideoCall.Listener#onSessionModifyResponseReceived}.
+         *
+         * @param responseProfile The response call video properties.
+         */
+        public abstract void onSendSessionModifyResponse(VideoCallProfile responseProfile);
+
+        /**
+         * Issues a request to the video provider to retrieve the camera capabilities.
+         * Camera capabilities are reported back to the caller via
+         * {@link InCallService.VideoCall.Listener#onCameraCapabilitiesChanged(CallCameraCapabilities)}.
+         */
+        public abstract void onRequestCameraCapabilities();
+
+        /**
+         * Issues a request to the video telephony framework to retrieve the cumulative data usage for
+         * the current call.  Data usage is reported back to the caller via
+         * {@link InCallService.VideoCall.Listener#onCallDataUsageChanged}.
+         */
+        public abstract void onRequestCallDataUsage();
+
+        /**
+         * Provides the video telephony framework with the URI of an image to be displayed to remote
+         * devices when the video signal is paused.
+         *
+         * @param uri URI of image to display.
+         */
+        public abstract void onSetPauseImage(String uri);
+
+        /**
+         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
+         *
+         * @param videoCallProfile The requested video call profile.
+         */
+        public void receiveSessionModifyRequest(VideoCallProfile videoCallProfile) {
+            if (mVideoCallListener != null) {
+                try {
+                    mVideoCallListener.receiveSessionModifyRequest(videoCallProfile);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
+
+        /**
+         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
+         *
+         * @param status Status of the session modify request.  Valid values are
+         *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_SUCCESS},
+         *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_FAIL},
+         *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_INVALID}
+         * @param requestedProfile The original request which was sent to the remote device.
+         * @param responseProfile The actual profile changes made by the remote device.
+         */
+        public void receiveSessionModifyResponse(int status,
+                                                 VideoCallProfile requestedProfile, VideoCallProfile responseProfile) {
+            if (mVideoCallListener != null) {
+                try {
+                    mVideoCallListener.receiveSessionModifyResponse(
+                            status, requestedProfile, responseProfile);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
+
+        /**
+         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
+         *
+         * Valid values are: {@link InCallService.VideoCall#SESSION_EVENT_RX_PAUSE},
+         * {@link InCallService.VideoCall#SESSION_EVENT_RX_RESUME},
+         * {@link InCallService.VideoCall#SESSION_EVENT_TX_START},
+         * {@link InCallService.VideoCall#SESSION_EVENT_TX_STOP}
+         *
+         * @param event The event.
+         */
+        public void handleCallSessionEvent(int event) {
+            if (mVideoCallListener != null) {
+                try {
+                    mVideoCallListener.handleCallSessionEvent(event);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
+
+        /**
+         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
+         *
+         * @param width  The updated peer video width.
+         * @param height The updated peer video height.
+         */
+        public void changePeerDimensions(int width, int height) {
+            if (mVideoCallListener != null) {
+                try {
+                    mVideoCallListener.changePeerDimensions(width, height);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
+
+        /**
+         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
+         *
+         * @param dataUsage The updated data usage.
+         */
+        public void changeCallDataUsage(int dataUsage) {
+            if (mVideoCallListener != null) {
+                try {
+                    mVideoCallListener.changeCallDataUsage(dataUsage);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
+
+        /**
+         * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
+         *
+         * @param callCameraCapabilities The changed camera capabilities.
+         */
+        public void changeCameraCapabilities(CallCameraCapabilities callCameraCapabilities) {
+            if (mVideoCallListener != null) {
+                try {
+                    mVideoCallListener.changeCameraCapabilities(callCameraCapabilities);
+                } catch (RemoteException ignored) {
+                }
+            }
+        }
+    }
 }
diff --git a/telecomm/java/android/telecomm/ConnectionServiceAdapter.java b/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
index 8f91e72..ea61362 100644
--- a/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
+++ b/telecomm/java/android/telecomm/ConnectionServiceAdapter.java
@@ -275,7 +275,8 @@
      * @param callId The unique ID of the call to set with the given call video provider.
      * @param videoCallProvider The call video provider instance to set on the call.
      */
-    void setVideoCallProvider(String callId, VideoCallProvider videoCallProvider) {
+    void setVideoCallProvider(
+            String callId, ConnectionService.VideoCallProvider videoCallProvider) {
         for (IConnectionServiceAdapter adapter : mAdapters) {
             try {
                 adapter.setVideoCallProvider(
diff --git a/telecomm/java/android/telecomm/InCallService.java b/telecomm/java/android/telecomm/InCallService.java
index 38de08e..14b25dc8 100644
--- a/telecomm/java/android/telecomm/InCallService.java
+++ b/telecomm/java/android/telecomm/InCallService.java
@@ -339,12 +339,13 @@
         public static abstract class Listener {
             /**
              * Called when a session modification request is received from the remote device.
-             * The remote request is sent via {@link VideoCallProvider#onSendSessionModifyRequest}.
-             * The InCall UI is responsible for potentially prompting the user whether they wish to
-             * accept the new call profile (e.g. prompt user if they wish to accept an upgrade from
-             * an audio to a video call) and should call
-             * {@link VideoCallProvider#onSendSessionModifyResponse} to indicate the video settings
-             * the user has agreed to.
+             * The remote request is sent via
+             * {@link ConnectionService.VideoCallProvider#onSendSessionModifyRequest}. The InCall UI
+             * is responsible for potentially prompting the user whether they wish to accept the new
+             * call profile (e.g. prompt user if they wish to accept an upgrade from an audio to a
+             * video call) and should call
+             * {@link ConnectionService.VideoCallProvider#onSendSessionModifyResponse} to indicate
+             * the video settings the user has agreed to.
              *
              * @param videoCallProfile The requested video call profile.
              */
@@ -353,7 +354,7 @@
             /**
              * Called when a response to a session modification request is received from the remote
              * device. The remote InCall UI sends the response using
-             * {@link VideoCallProvider#onSendSessionModifyResponse}.
+             * {@link ConnectionService.VideoCallProvider#onSendSessionModifyResponse}.
              *
              * @param status Status of the session modify request.  Valid values are
              *               {@link VideoCall#SESSION_MODIFY_REQUEST_SUCCESS},
diff --git a/telecomm/java/android/telecomm/VideoCallImpl.java b/telecomm/java/android/telecomm/VideoCallImpl.java
index 3e538cb..c32bcd2 100644
--- a/telecomm/java/android/telecomm/VideoCallImpl.java
+++ b/telecomm/java/android/telecomm/VideoCallImpl.java
@@ -30,8 +30,8 @@
 
 /**
  * Implementation of a Video Call, which allows InCallUi to communicate commands to the underlying
- * {@link VideoCallProvider}, and direct callbacks from the {@link VideoCallProvider} to the
- * appropriate {@link VideoCall.Listener}.
+ * {@link ConnectionService.VideoCallProvider}, and direct callbacks from the
+ * {@link ConnectionService.VideoCallProvider} to the appropriate {@link VideoCall.Listener}.
  */
 public class VideoCallImpl extends VideoCall {
     private static final int MSG_RECEIVE_SESSION_MODIFY_REQUEST = 1;
diff --git a/telecomm/java/android/telecomm/VideoCallProvider.java b/telecomm/java/android/telecomm/VideoCallProvider.java
deleted file mode 100644
index de0126d..0000000
--- a/telecomm/java/android/telecomm/VideoCallProvider.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
- * Copyright (C) 2014 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 android.telecomm;
-
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Message;
-import android.os.RemoteException;
-import android.view.Surface;
-
-import com.android.internal.telecomm.IVideoCallCallback;
-import com.android.internal.telecomm.IVideoCallProvider;
-
-public abstract class VideoCallProvider {
-    private static final int MSG_SET_VIDEO_CALL_LISTENER = 1;
-    private static final int MSG_SET_CAMERA = 2;
-    private static final int MSG_SET_PREVIEW_SURFACE = 3;
-    private static final int MSG_SET_DISPLAY_SURFACE = 4;
-    private static final int MSG_SET_DEVICE_ORIENTATION = 5;
-    private static final int MSG_SET_ZOOM = 6;
-    private static final int MSG_SEND_SESSION_MODIFY_REQUEST = 7;
-    private static final int MSG_SEND_SESSION_MODIFY_RESPONSE = 8;
-    private static final int MSG_REQUEST_CAMERA_CAPABILITIES = 9;
-    private static final int MSG_REQUEST_CALL_DATA_USAGE = 10;
-    private static final int MSG_SET_PAUSE_IMAGE = 11;
-
-    private final VideoCallProviderHandler mMessageHandler = new VideoCallProviderHandler();
-    private final VideoCallProviderBinder mBinder;
-    private IVideoCallCallback mVideoCallListener;
-
-    /**
-     * Default handler used to consolidate binder method calls onto a single thread.
-     */
-    private final class VideoCallProviderHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case MSG_SET_VIDEO_CALL_LISTENER:
-                    mVideoCallListener = IVideoCallCallback.Stub.asInterface((IBinder) msg.obj);
-                    break;
-                case MSG_SET_CAMERA:
-                    onSetCamera((String) msg.obj);
-                    break;
-                case MSG_SET_PREVIEW_SURFACE:
-                    onSetPreviewSurface((Surface) msg.obj);
-                    break;
-                case MSG_SET_DISPLAY_SURFACE:
-                    onSetDisplaySurface((Surface) msg.obj);
-                    break;
-                case MSG_SET_DEVICE_ORIENTATION:
-                    onSetDeviceOrientation(msg.arg1);
-                    break;
-                case MSG_SET_ZOOM:
-                    onSetZoom((Float) msg.obj);
-                    break;
-                case MSG_SEND_SESSION_MODIFY_REQUEST:
-                    onSendSessionModifyRequest((VideoCallProfile) msg.obj);
-                    break;
-                case MSG_SEND_SESSION_MODIFY_RESPONSE:
-                    onSendSessionModifyResponse((VideoCallProfile) msg.obj);
-                    break;
-                case MSG_REQUEST_CAMERA_CAPABILITIES:
-                    onRequestCameraCapabilities();
-                    break;
-                case MSG_REQUEST_CALL_DATA_USAGE:
-                    onRequestCallDataUsage();
-                    break;
-                case MSG_SET_PAUSE_IMAGE:
-                    onSetPauseImage((String) msg.obj);
-                    break;
-                default:
-                    break;
-            }
-        }
-    }
-
-    /**
-     * IVideoCallProvider stub implementation.
-     */
-    private final class VideoCallProviderBinder extends IVideoCallProvider.Stub {
-        public void setVideoCallListener(IBinder videoCallListenerBinder) {
-            mMessageHandler.obtainMessage(
-                    MSG_SET_VIDEO_CALL_LISTENER, videoCallListenerBinder).sendToTarget();
-        }
-
-        public void setCamera(String cameraId) {
-            mMessageHandler.obtainMessage(MSG_SET_CAMERA, cameraId).sendToTarget();
-        }
-
-        public void setPreviewSurface(Surface surface) {
-            mMessageHandler.obtainMessage(MSG_SET_PREVIEW_SURFACE, surface).sendToTarget();
-        }
-
-        public void setDisplaySurface(Surface surface) {
-            mMessageHandler.obtainMessage(MSG_SET_DISPLAY_SURFACE, surface).sendToTarget();
-        }
-
-        public void setDeviceOrientation(int rotation) {
-            mMessageHandler.obtainMessage(MSG_SET_DEVICE_ORIENTATION, rotation).sendToTarget();
-        }
-
-        public void setZoom(float value) {
-            mMessageHandler.obtainMessage(MSG_SET_ZOOM, value).sendToTarget();
-        }
-
-        public void sendSessionModifyRequest(VideoCallProfile requestProfile) {
-            mMessageHandler.obtainMessage(
-                    MSG_SEND_SESSION_MODIFY_REQUEST, requestProfile).sendToTarget();
-        }
-
-        public void sendSessionModifyResponse(VideoCallProfile responseProfile) {
-            mMessageHandler.obtainMessage(
-                    MSG_SEND_SESSION_MODIFY_RESPONSE, responseProfile).sendToTarget();
-        }
-
-        public void requestCameraCapabilities() {
-            mMessageHandler.obtainMessage(MSG_REQUEST_CAMERA_CAPABILITIES).sendToTarget();
-        }
-
-        public void requestCallDataUsage() {
-            mMessageHandler.obtainMessage(MSG_REQUEST_CALL_DATA_USAGE).sendToTarget();
-        }
-
-        public void setPauseImage(String uri) {
-            mMessageHandler.obtainMessage(MSG_SET_PAUSE_IMAGE, uri).sendToTarget();
-        }
-    }
-
-    public VideoCallProvider() {
-        mBinder = new VideoCallProviderBinder();
-    }
-
-    /**
-     * Returns binder object which can be used across IPC methods.
-     * @hide
-     */
-    public final IVideoCallProvider getInterface() {
-        return mBinder;
-    }
-
-    /**
-     * Sets the camera to be used for video recording in a video call.
-     *
-     * @param cameraId The id of the camera.
-     */
-    public abstract void onSetCamera(String cameraId);
-
-    /**
-     * Sets the surface to be used for displaying a preview of what the user's camera is
-     * currently capturing.  When video transmission is enabled, this is the video signal which is
-     * sent to the remote device.
-     *
-     * @param surface The surface.
-     */
-    public abstract void onSetPreviewSurface(Surface surface);
-
-    /**
-     * Sets the surface to be used for displaying the video received from the remote device.
-     *
-     * @param surface The surface.
-     */
-    public abstract void onSetDisplaySurface(Surface surface);
-
-    /**
-     * Sets the device orientation, in degrees.  Assumes that a standard portrait orientation of the
-     * device is 0 degrees.
-     *
-     * @param rotation The device orientation, in degrees.
-     */
-    public abstract void onSetDeviceOrientation(int rotation);
-
-    /**
-     * Sets camera zoom ratio.
-     *
-     * @param value The camera zoom ratio.
-     */
-    public abstract void onSetZoom(float value);
-
-    /**
-     * Issues a request to modify the properties of the current session.  The request is sent to
-     * the remote device where it it handled by
-     * {@link InCallService.VideoCall.Listener#onSessionModifyRequestReceived}.
-     * Some examples of session modification requests: upgrade call from audio to video, downgrade
-     * call from video to audio, pause video.
-     *
-     * @param requestProfile The requested call video properties.
-     */
-    public abstract void onSendSessionModifyRequest(VideoCallProfile requestProfile);
-
-    /**te
-     * Provides a response to a request to change the current call session video
-     * properties.
-     * This is in response to a request the InCall UI has received via
-     * {@link InCallService.VideoCall.Listener#onSessionModifyRequestReceived}.
-     * The response is handled on the remove device by
-     * {@link InCallService.VideoCall.Listener#onSessionModifyResponseReceived}.
-     *
-     * @param responseProfile The response call video properties.
-     */
-    public abstract void onSendSessionModifyResponse(VideoCallProfile responseProfile);
-
-    /**
-     * Issues a request to the video provider to retrieve the camera capabilities.
-     * Camera capabilities are reported back to the caller via
-     * {@link InCallService.VideoCall.Listener#onCameraCapabilitiesChanged(CallCameraCapabilities)}.
-     */
-    public abstract void onRequestCameraCapabilities();
-
-    /**
-     * Issues a request to the video telephony framework to retrieve the cumulative data usage for
-     * the current call.  Data usage is reported back to the caller via
-     * {@link InCallService.VideoCall.Listener#onCallDataUsageChanged}.
-     */
-    public abstract void onRequestCallDataUsage();
-
-    /**
-     * Provides the video telephony framework with the URI of an image to be displayed to remote
-     * devices when the video signal is paused.
-     *
-     * @param uri URI of image to display.
-     */
-    public abstract void onSetPauseImage(String uri);
-
-    /**
-     * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
-     *
-     * @param videoCallProfile The requested video call profile.
-     */
-    public void receiveSessionModifyRequest(VideoCallProfile videoCallProfile) {
-        if (mVideoCallListener != null) {
-            try {
-                mVideoCallListener.receiveSessionModifyRequest(videoCallProfile);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
-    /**
-     * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
-     *
-     * @param status Status of the session modify request.  Valid values are
-     *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_SUCCESS},
-     *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_FAIL},
-     *               {@link InCallService.VideoCall#SESSION_MODIFY_REQUEST_INVALID}
-     * @param requestedProfile The original request which was sent to the remote device.
-     * @param responseProfile The actual profile changes made by the remote device.
-     */
-    public void receiveSessionModifyResponse(int status,
-            VideoCallProfile requestedProfile, VideoCallProfile responseProfile) {
-        if (mVideoCallListener != null) {
-            try {
-                mVideoCallListener.receiveSessionModifyResponse(
-                    status, requestedProfile, responseProfile);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
-    /**
-     * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
-     *
-     * Valid values are: {@link InCallService.VideoCall#SESSION_EVENT_RX_PAUSE},
-     * {@link InCallService.VideoCall#SESSION_EVENT_RX_RESUME},
-     * {@link InCallService.VideoCall#SESSION_EVENT_TX_START},
-     * {@link InCallService.VideoCall#SESSION_EVENT_TX_STOP}
-     *
-     * @param event The event.
-     */
-    public void handleCallSessionEvent(int event) {
-        if (mVideoCallListener != null) {
-            try {
-                mVideoCallListener.handleCallSessionEvent(event);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
-    /**
-     * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
-     *
-     * @param width  The updated peer video width.
-     * @param height The updated peer video height.
-     */
-    public void changePeerDimensions(int width, int height) {
-        if (mVideoCallListener != null) {
-            try {
-                mVideoCallListener.changePeerDimensions(width, height);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
-    /**
-     * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
-     *
-     * @param dataUsage The updated data usage.
-     */
-    public void changeCallDataUsage(int dataUsage) {
-        if (mVideoCallListener != null) {
-            try {
-                mVideoCallListener.changeCallDataUsage(dataUsage);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-
-    /**
-     * Invokes callback method defined in {@link InCallService.VideoCall.Listener}.
-     *
-     * @param callCameraCapabilities The changed camera capabilities.
-     */
-    public void changeCameraCapabilities(CallCameraCapabilities callCameraCapabilities) {
-        if (mVideoCallListener != null) {
-            try {
-                mVideoCallListener.changeCameraCapabilities(callCameraCapabilities);
-            } catch (RemoteException ignored) {
-            }
-        }
-    }
-}
diff --git a/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java b/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java
index f72e331..f4f610b 100644
--- a/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java
+++ b/tests/DozeTest/src/com/android/dreams/dozetest/DozeTestDream.java
@@ -24,7 +24,6 @@
 import android.content.IntentFilter;
 import android.os.Handler;
 import android.os.PowerManager;
-import android.service.dreams.DozeHardware;
 import android.service.dreams.DreamService;
 import android.text.format.DateFormat;
 import android.util.Log;
@@ -49,10 +48,6 @@
     // refreshed once the dream has finished rendering a new frame.
     private static final int UPDATE_TIME_TIMEOUT = 100;
 
-    // A doze hardware message string we use for end-to-end testing.
-    // Doesn't mean anything.  Real hardware won't handle it.
-    private static final String TEST_PING_MESSAGE = "test.ping";
-
     // Not all hardware supports dozing.  We should use Display.STATE_DOZE but
     // for testing purposes it is convenient to use Display.STATE_ON so the
     // test still works on hardware that does not support dozing.
@@ -70,7 +65,6 @@
     private java.text.DateFormat mTimeFormat;
 
     private boolean mDreaming;
-    private DozeHardware mDozeHardware;
 
     private long mLastTime = Long.MIN_VALUE;
 
@@ -121,17 +115,11 @@
         super.onDreamingStarted();
 
         mDreaming = true;
-        mDozeHardware = getDozeHardware();
 
-        Log.d(TAG, "Dream started: canDoze=" + canDoze()
-                + ", dozeHardware=" + mDozeHardware);
+        Log.d(TAG, "Dream started: canDoze=" + canDoze());
 
         performTimeUpdate();
 
-        if (mDozeHardware != null) {
-            mDozeHardware.sendMessage(TEST_PING_MESSAGE, null);
-            mDozeHardware.setEnableMcu(true);
-        }
         startDozing();
     }
 
@@ -140,10 +128,6 @@
         super.onDreamingStopped();
 
         mDreaming = false;
-        if (mDozeHardware != null) {
-            mDozeHardware.setEnableMcu(false);
-            mDozeHardware = null;
-        }
 
         Log.d(TAG, "Dream ended: isDozing=" + isDozing());
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable01.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable01.xml
index 3b01e02..705cc34 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable01.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable01.xml
@@ -13,22 +13,18 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android">
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="48dp"
-        android:width="48dp" />
-
-    <viewport
+        android:width="48dp"
         android:viewportHeight="480"
-        android:viewportWidth="480" />
+        android:viewportWidth="480" >
 
     <group>
         <path
             android:name="box1"
             android:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
-            android:fill="?android:attr/colorControlActivated"
-            android:stroke="?android:attr/colorControlActivated"
+            android:fillColor="?android:attr/colorControlActivated"
+            android:strokeColor="?android:attr/colorControlActivated"
             android:strokeLineCap="round"
             android:strokeLineJoin="round" />
     </group>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable02.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable02.xml
index 40f23f0..f5d647c 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable02.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable02.xml
@@ -12,14 +12,10 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:width="64dp"
-        android:height="64dp"/>
-
-    <viewport android:viewportWidth="320"
-          android:viewportHeight="320"/>
+        android:height="64dp" android:viewportWidth="320"
+          android:viewportHeight="320">
     <group
         android:rotation="180"
         android:pivotX="70"
@@ -27,8 +23,8 @@
         <path
             android:name="house"
             android:pathData="M 130,225 L 130,115 L 130,115 L 70,15 L 10,115 L 10,115 L 10,225 z"
-            android:fill="#ff440000"
-            android:stroke="#FF00FF00"
+            android:fillColor="#ff440000"
+            android:strokeColor="#FF00FF00"
             android:strokeWidth="10"
             android:trimPathStart=".1"
             android:trimPathEnd=".9"/>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml
index cd2fd47..a0b0e00 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable03.xml
@@ -14,23 +14,17 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:autoMirrored="true" >
-
-    <size
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="12.25"
-        android:viewportWidth="7.30625" />
+        android:viewportWidth="7.30625" >
 
     <group
         android:pivotX="3.65"
         android:pivotY="6.125"
         android:rotation="-30" >
-        <path
+        <clip-path
             android:name="clip1"
-            android:clipToPath="true"
             android:pathData="
                 M 0, 6.125
                 l 7.3, 0
@@ -41,7 +35,7 @@
     <group>
         <path
             android:name="one"
-            android:fill="#ff88ff"
+            android:fillColor="#ff88ff"
             android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
                 l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
                 l-5.046875,0.0 0.0-1.0Z" />
@@ -50,9 +44,8 @@
         android:pivotX="3.65"
         android:pivotY="6.125"
         android:rotation="-30" >
-        <path
+        <clip-path
             android:name="clip2"
-            android:clipToPath="true"
             android:pathData="
                 M 0, 0
                 l 7.3, 0
@@ -63,7 +56,7 @@
     <group>
         <path
             android:name="two"
-            android:fill="#ff88ff"
+            android:fillColor="#ff88ff"
             android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
                         q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
                         q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml
index d57ae8b..5a7f380 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable04.xml
@@ -13,45 +13,33 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:autoMirrored="true">
-
-    <size
             android:width="64dp"
-            android:height="64dp"/>
-
-    <viewport
+            android:height="64dp"
             android:viewportWidth="7.30625"
-            android:viewportHeight="12.25"/>
+            android:viewportHeight="12.25">
 
     <group>
-        <path
+        <clip-path
                 android:name="clip1"
                 android:pathData="
                 M 3.65, 6.125
                 m-.001, 0
                 a .001,.001 0 1,0 .002,0
-                a .001,.001 0 1,0-.002,0z"
-                android:clipToPath="true"
-                android:fill="#112233"
-                />
-
+                a .001,.001 0 1,0-.002,0z"/>
         <path
                 android:name="one"
                 android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
                 l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
                 l-5.046875,0.0 0.0-1.0Z"
-                android:fill="#ff88ff"
-                />
-        <path
+                android:fillColor="#ff88ff"/>
+
+        <clip-path
                 android:name="clip2"
                 android:pathData="
                 M 3.65, 6.125
                 m-6, 0
                 a 6,6 0 1,0 12,0
-                a 6,6 0 1,0-12,0z"
-                android:clipToPath="true"
-                android:fill="#112233"
-                />
+                a 6,6 0 1,0-12,0z"/>
         <path
                 android:name="two"
                 android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
@@ -63,7 +51,6 @@
                         q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
                         q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
                         q-0.78125024,0.8125-2.2187502,2.265625Z"
-                android:fill="#ff88ff"
-                />
+                android:fillColor="#ff88ff"/>
     </group>
 </vector>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable05.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable05.xml
index 673c465..5b1f6ab 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable05.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable05.xml
@@ -14,26 +14,21 @@
      limitations under the License.
 -->
 <vector xmlns:android="http://schemas.android.com/apk/res/android"
-    android:autoMirrored="true">
-
-    <size
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="12.25"
-        android:viewportWidth="7.30625" />
+        android:viewportWidth="7.30625" >
 
     <group>
         <path
             android:name="one"
-            android:fill="#ffff00"
+            android:fillColor="#ffff00"
             android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
                 l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
                 l-5.046875,0.0 0.0-1.0Z" />
         <path
             android:name="two"
-            android:fill="#ffff00"
+            android:fillColor="#ffff00"
             android:fillOpacity="0"
             android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
                         q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable06.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable06.xml
index ab5f7f4..98b6235 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable06.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable06.xml
@@ -12,41 +12,37 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
             android:width="64dp"
-            android:height="64dp"/>
-
-    <viewport
+            android:height="64dp"
             android:viewportWidth="700"
-            android:viewportHeight="700"/>
+            android:viewportHeight="700">
 
     <group>
         <path android:pathData="M 569.374 461.472L 569.374 160.658L 160.658 160.658L 160.658 461.472L 569.374 461.472z"
               android:name="path2451"
-              android:fill="#00000000"
-              android:stroke="#FF000000"
+              android:fillColor="#00000000"
+              android:strokeColor="#FF000000"
               android:strokeWidth="30.65500000000000"/>
         <path android:pathData="M 365.015 311.066"
               android:name="path2453"
-              android:fill="#00000000"
-              android:stroke="#FF000000"
+              android:fillColor="#00000000"
+              android:strokeColor="#FF000000"
               android:strokeWidth="30.655000000000001"/>
         <path android:pathData="M 164.46 164.49L 340.78 343.158C 353.849 356.328 377.63 356.172 390.423 343.278L 566.622 165.928"
               android:name="path2455"
-              android:stroke="#FF000000"
-              android:fill="#FFFFFFFF"
+              android:strokeColor="#FF000000"
+              android:fillColor="#FFFFFFFF"
               android:strokeWidth="30.655000000000001"/>
         <path android:pathData="M 170.515 451.566L 305.61 313.46"
               android:name="path2457"
-              android:fill="#00000000"
-              android:stroke="#000000"
+              android:fillColor="#00000000"
+              android:strokeColor="#000000"
               android:strokeWidth="30.655000000000001"/>
         <path android:pathData="M 557.968 449.974L 426.515 315.375"
               android:name="path2459"
-              android:fill="#00000000"
-              android:stroke="#000000"
+              android:fillColor="#00000000"
+              android:strokeColor="#000000"
               android:strokeWidth="30.655000000000001"/>
     </group>
 </vector>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable07.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable07.xml
index ccb0df0..88c4a1e 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable07.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable07.xml
@@ -12,13 +12,10 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android"   >
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
             android:width="64dp"
-            android:height="64dp"/>
-
-    <viewport android:viewportWidth="140"
-          android:viewportHeight="110"/>
+            android:height="64dp" android:viewportWidth="140"
+          android:viewportHeight="110">
 
     <group>
         <path
@@ -26,7 +23,7 @@
                 android:pathData="M 20,55 l 35.3-35.3 7.07,7.07-35.3,35.3 z
               M 27,50 l 97,0 0,10-97,0 z
               M 20,55 l 7.07-7.07 35.3,35.3-7.07,7.07 z"
-                android:fill="#ffffffff"
+                android:fillColor="#ffffffff"
                 />
     </group>
 </vector>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable08.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable08.xml
index 59f7459..75529e2 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable08.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable08.xml
@@ -12,22 +12,17 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
             android:width="64dp"
-            android:height="64dp"/>
-
-
-    <viewport android:viewportWidth="600"
-          android:viewportHeight="600"/>
+            android:height="64dp" android:viewportWidth="600"
+          android:viewportHeight="600">
 
     <group>
         <path
                 android:name="pie1"
                 android:pathData="M535.441,412.339A280.868,280.868 0 1,1 536.186,161.733L284.493,286.29Z"
-                android:fill="#ffffcc00"
-                android:stroke="#FF00FF00"
+                android:fillColor="#ffffcc00"
+                android:strokeColor="#FF00FF00"
                 android:strokeWidth="1"/>
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable09.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable09.xml
index 77434fc..853a770 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable09.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable09.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="200"
-        android:viewportWidth="200" />
+        android:viewportWidth="200" >
 
     <group
         android:pivotX="100"
@@ -29,7 +25,7 @@
         android:rotation="90">
         <path
             android:name="house"
-            android:fill="#ffffffff"
+            android:fillColor="#ffffffff"
             android:pathData="M 100,20 l 0,0 0,140-80,0 z M 100,20 l 0,0 80,140-80,0 z"/>
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable10.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable10.xml
index df24713..83ed194 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable10.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable10.xml
@@ -14,32 +14,28 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportWidth="200"
-        android:viewportHeight="200"/>
+        android:viewportHeight="200">
 
     <group>
         <path
             android:name="bar3"
-            android:fill="#FFFFFFFF"
+            android:fillColor="#FFFFFFFF"
             android:pathData="M49.001,60c-5.466,0-9.899,4.478-9.899,10s4.434,10,9.899,10c5.468,0,9.899-4.478,9.899-10S54.469,60,49.001,60z" />
         <path
             android:name="bar2"
-            android:fill="#FFFFFFFF"
+            android:fillColor="#FFFFFFFF"
             android:pathData="M28.001,48.787l7,7.07c7.731-7.811,20.269-7.81,28.001,0l6.999-7.07C58.403,37.071,39.599,37.071,28.001,48.787z" />
         <path
             android:name="bar1"
-            android:fill="#FF555555"
+            android:fillColor="#FF555555"
             android:pathData="M14.001,34.645   L21,41.716c15.464-15.621,40.536-15.621,56,0l7.001-7.071C64.672,15.119,33.33,15.119,14.001,34.645z" />
         <path
             android:name="bar0"
-            android:fill="#FF555555"
+            android:fillColor="#FF555555"
             android:pathData="M0,20.502l6.999,7.071   c23.196-23.431,60.806-23.431,84.002,0L98,20.503C70.938-6.834,27.063-6.834,0,20.502z" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable11.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable11.xml
index 3422bbf..b3d7d8e 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable11.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable11.xml
@@ -13,26 +13,22 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="80"
-        android:viewportWidth="40" />
+        android:viewportWidth="40" >
 
     <group>
         <path
             android:name="battery"
-            android:fill="#3388ff"
+            android:fillColor="#3388ff"
             android:pathData="M 20.28125,2.0000002 C 17.352748,2.0000002 15,4.3527485 15,7.2812502 L 15,8.0000002 L 13.15625,8.0000002 C 9.7507553,8.0000002 7,10.750759 7,14.15625 L 7,39.84375 C 7,43.24924 9.7507558,46 13.15625,46 L 33.84375,46 C 37.249245,46 39.999999,43.24924 40,39.84375 L 40,14.15625 C 40,10.75076 37.249243,8.0000002 33.84375,8.0000002 L 32,8.0000002 L 32,7.2812502 C 32,4.3527485 29.647252,2.0000002 26.71875,2.0000002 L 20.28125,2.0000002 z"
-            android:stroke="#ff8833"
+            android:strokeColor="#ff8833"
             android:strokeWidth="1" />
         <path
             android:name="spark"
-            android:fill="#FFFF0000"
+            android:fillColor="#FFFF0000"
             android:pathData="M 30,18.031528 L 25.579581,23.421071 L 29.370621,26.765348 L 20.096792,37 L 21.156922,28.014053 L 17,24.902844 L 20.880632,18 L 30,18.031528 z" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable12.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable12.xml
index a212def..2c8b751 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable12.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable12.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="600"
-        android:viewportWidth="600" />
+        android:viewportWidth="600" >
 
     <group
         android:name="rotationGroup"
@@ -30,16 +26,16 @@
         android:rotation="45.0" >
         <path
             android:name="pie1"
-            android:fill="#00000000"
+            android:fillColor="#00000000"
             android:pathData="M300,70 a230,230 0 1,0 1,0 z"
-            android:stroke="#FF777777"
+            android:strokeColor="#FF777777"
             android:strokeWidth="70"
             android:trimPathEnd=".75"
             android:trimPathOffset="0"
             android:trimPathStart="0" />
         <path
             android:name="v"
-            android:fill="#000000"
+            android:fillColor="#000000"
             android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
 
         <group
@@ -55,7 +51,7 @@
                 <path
                     android:name="twoLines1"
                     android:pathData="@string/twoLinePathData"
-                    android:stroke="#FFFF0000"
+                    android:strokeColor="#FFFF0000"
                     android:strokeWidth="20" />
 
                 <group
@@ -69,9 +65,9 @@
                         android:rotation="-45.0" >
                         <path
                             android:name="twoLines2"
-                            android:fill="#FF00FF00"
+                            android:fillColor="#FF00FF00"
                             android:pathData="@string/twoLinePathData"
-                            android:stroke="#FF00FF00"
+                            android:strokeColor="#FF00FF00"
                             android:strokeWidth="20" />
 
                         <group
@@ -86,7 +82,7 @@
                                 <path
                                     android:name="twoLines3"
                                     android:pathData="@string/twoLinePathData"
-                                    android:stroke="#FF0000FF"
+                                    android:strokeColor="#FF0000FF"
                                     android:strokeWidth="20" />
                             </group>
                         </group>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable13.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable13.xml
index 8c946df..2468a1b 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable13.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable13.xml
@@ -13,28 +13,24 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="600" />
+        android:viewportWidth="600" >
 
     <group>
         <path
             android:name="pie1"
-            android:fill="#ffffffff"
+            android:fillColor="#ffffffff"
             android:pathData="M300,200 h-150 a150,150 0 1,0 150,-150 z"
-            android:stroke="#FF00FF00"
+            android:strokeColor="#FF00FF00"
             android:strokeWidth="1" />
         <path
             android:name="half"
-            android:fill="#FFFF0000"
+            android:fillColor="#FFFF0000"
             android:pathData="M275,175 v-150 a150,150 0 0,0 -150,150 z"
-            android:stroke="#FF0000FF"
+            android:strokeColor="#FF0000FF"
             android:strokeWidth="5" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable14.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable14.xml
index 8d4ca61..01e24d302 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable14.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable14.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="500"
-        android:viewportWidth="800" />
+        android:viewportWidth="800" >
 
     <group
         android:pivotX="90"
@@ -34,8 +30,8 @@
            a25,25 -30 0,1 100,-50 l 50,-25
            a25,37 -30 0,1 100,-50 l 50,-25
            a25,50 -30 0,1 100,-50 l 50,-25"
-            android:fill="#00000000"
-            android:stroke="#FF00FF00"
+            android:fillColor="#00000000"
+            android:strokeColor="#FF00FF00"
             android:strokeWidth="10" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable15.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable15.xml
index b08e157..4bab2e3 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable15.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable15.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="500" />
+        android:viewportWidth="500" >
 
     <group
         android:pivotX="250"
@@ -29,9 +25,9 @@
         android:rotation="180">
         <path
             android:name="house"
-            android:fill="#ff440000"
+            android:fillColor="#ff440000"
             android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
-            android:stroke="#FFFF0000"
+            android:strokeColor="#FFFF0000"
             android:strokeWidth="10" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable16.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable16.xml
index ae85d9b..107cda2 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable16.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable16.xml
@@ -13,25 +13,21 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="200"
-        android:viewportWidth="200" />
+        android:viewportWidth="200" >
 
     <group>
         <path
             android:name="background1"
             android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
-            android:fill="#FF000000"/>
+            android:fillColor="#FF000000"/>
         <path
             android:name="background2"
             android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
-            android:fill="#FF000000"/>
+            android:fillColor="#FF000000"/>
     </group>
     <group
         android:pivotX="100"
@@ -44,7 +40,7 @@
         <path
             android:name="twoLines"
             android:pathData="M 100,10 v 90 M 10,100 h 90"
-            android:stroke="#FF00FF00"
+            android:strokeColor="#FF00FF00"
             android:strokeWidth="10" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable17.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable17.xml
index c28aff4..8019549 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable17.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable17.xml
@@ -12,21 +12,17 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
             android:width="64dp"
-            android:height="64dp"/>
-
-    <viewport android:viewportWidth="1200"
-          android:viewportHeight="600"/>
+            android:height="64dp" android:viewportWidth="1200"
+          android:viewportHeight="600">
 
     <group>
         <path
                 android:name="house"
                 android:pathData="M200,300 Q400,50 600,300 T1000,300"
-                android:fill="#00000000"
-                android:stroke="#FFFF0000"
+                android:fillColor="#00000000"
+                android:strokeColor="#FFFF0000"
                 android:strokeWidth="10"/>
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable18.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable18.xml
index d7042fd..c93bdb9 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable18.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable18.xml
@@ -13,22 +13,18 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="500" />
+        android:viewportWidth="500" >
 
     <group>
         <path
             android:name="house"
             android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
-            android:fill="#00000000"
-            android:stroke="#FFFFFF00"
+            android:fillColor="#00000000"
+            android:strokeColor="#FFFFFF00"
             android:strokeWidth="10" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable19.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable19.xml
index 47a9574..996b6be 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable19.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable19.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="800"
-        android:viewportWidth="1000" />
+        android:viewportWidth="1000" >
 
     <group>
         <path
@@ -29,8 +25,8 @@
             android:pathData="M10,300 Q400,550 600,300 T1000,300"
             android:pivotX="90"
             android:pivotY="100"
-            android:fill="#00000000"
-            android:stroke="#FFFF0000"
+            android:fillColor="#00000000"
+            android:strokeColor="#FFFF0000"
             android:strokeWidth="60" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable20.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable20.xml
index b8af7e2..5802144 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable20.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable20.xml
@@ -13,25 +13,21 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="480"
-        android:viewportWidth="480" />
+        android:viewportWidth="480" >
 
     <group>
         <path
             android:name="edit"
-            android:fill="#FF00FFFF"
+            android:fillColor="#FF00FFFF"
             android:pathData="M406.667,180c0,0 -100 -100 -113.334 -113.333
     c-13.333 -13.334 -33.333,0 -33.333,0l-160,160c0,0 -40,153.333 -40,173.333c0,13.333,13.333,13.333,13.333,13.333l173.334 -40
     c0,0,146.666 -146.666,160 -160C420,200,406.667,180,406.667,180z M226.399,356.823L131.95,378.62l-38.516 -38.522
     c7.848 -34.675,20.152 -82.52,23.538 -95.593l3.027,2.162l106.667,106.666L226.399,356.823z"
-            android:stroke="#FF000000"
+            android:strokeColor="#FF000000"
             android:strokeWidth="10" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable21.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable21.xml
index e0013e7..5626b44 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable21.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable21.xml
@@ -13,25 +13,21 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="200"
-        android:viewportWidth="200" />
+        android:viewportWidth="200" >
 
     <group>
         <path
             android:name="background1"
             android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
-            android:fill="#FF000000"/>
+            android:fillColor="#FF000000"/>
         <path
             android:name="background2"
             android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
-            android:fill="#FF000000"/>
+            android:fillColor="#FF000000"/>
     </group>
     <group
         android:pivotX="0"
@@ -44,7 +40,7 @@
         <path
             android:name="twoLines"
             android:pathData="M 100,10 v 90 M 10,100 h 90"
-            android:stroke="#FF00FF00"
+            android:strokeColor="#FF00FF00"
             android:strokeWidth="10" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable22.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable22.xml
index 8d38cb5..5b40d0d0 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable22.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable22.xml
@@ -13,24 +13,20 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="400" />
+        android:viewportWidth="400" >
 
     <group android:name="backgroundGroup" >
         <path
             android:name="background1"
-            android:fill="#80000000"
+            android:fillColor="#80000000"
             android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
         <path
             android:name="background2"
-            android:fill="#80000000"
+            android:fillColor="#80000000"
             android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
     </group>
     <group
@@ -40,7 +36,7 @@
         <path
             android:name="twoLines"
             android:pathData="M 0,0 v 100 M 0,0 h 100"
-            android:stroke="#FFFF0000"
+            android:strokeColor="#FFFF0000"
             android:strokeWidth="20" />
 
         <group
@@ -51,7 +47,7 @@
             <path
                 android:name="twoLines1"
                 android:pathData="M 0,0 v 100 M 0,0 h 100"
-                android:stroke="#FF00FF00"
+                android:strokeColor="#FF00FF00"
                 android:strokeWidth="20" />
 
             <group
@@ -62,7 +58,7 @@
                     <path
                         android:name="twoLines2"
                         android:pathData="M 0,0 v 100 M 0,0 h 100"
-                        android:stroke="#FF0000FF"
+                        android:strokeColor="#FF0000FF"
                         android:strokeWidth="20" />
                 </group>
             </group>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable23.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable23.xml
index 52acd7a..6ab6ffd 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable23.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable23.xml
@@ -13,24 +13,20 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="400" />
+        android:viewportWidth="400" >
 
     <group android:name="backgroundGroup" >
         <path
             android:name="background1"
-            android:fill="#80000000"
+            android:fillColor="#80000000"
             android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
         <path
             android:name="background2"
-            android:fill="#80000000"
+            android:fillColor="#80000000"
             android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
     </group>
     <group
@@ -40,7 +36,7 @@
         <path
             android:name="twoLines"
             android:pathData="@string/twoLinePathData"
-            android:stroke="#FFFF0000"
+            android:strokeColor="#FFFF0000"
             android:strokeWidth="20" />
 
         <group
@@ -51,7 +47,7 @@
             <path
                 android:name="twoLines1"
                 android:pathData="@string/twoLinePathData"
-                android:stroke="#FF00FF00"
+                android:strokeColor="#FF00FF00"
                 android:strokeWidth="20" />
 
             <group
@@ -62,7 +58,7 @@
                     <path
                         android:name="twoLines3"
                         android:pathData="@string/twoLinePathData"
-                        android:stroke="#FF0000FF"
+                        android:strokeColor="#FF0000FF"
                         android:strokeWidth="20" />
                 </group>
             </group>
@@ -75,8 +71,8 @@
                     <path
                         android:name="twoLines2"
                         android:pathData="@string/twoLinePathData"
-                        android:fill="?android:attr/colorForeground"
-                        android:stroke="?android:attr/colorForeground"
+                        android:fillColor="?android:attr/colorForeground"
+                        android:strokeColor="?android:attr/colorForeground"
                         android:strokeWidth="20" />
                 </group>
             </group>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml
index c062d70..5c1ccaa 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable24.xml
@@ -13,25 +13,21 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="400" />
+        android:viewportWidth="400" >
 
     <group android:name="backgroundGroup"
         android:alpha = "0.5" >
         <path
             android:name="background1"
-            android:fill="#FF000000"
+            android:fillColor="#FF000000"
             android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
         <path
             android:name="background2"
-            android:fill="#FF000000"
+            android:fillColor="#FF000000"
             android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
     </group>
     <group
@@ -42,7 +38,7 @@
         <path
             android:name="twoLines"
             android:pathData="@string/twoLinePathData"
-            android:stroke="#FFFF0000"
+            android:strokeColor="#FFFF0000"
             android:strokeWidth="20" />
 
         <group
@@ -54,7 +50,7 @@
             <path
                 android:name="twoLines1"
                 android:pathData="@string/twoLinePathData"
-                android:stroke="#FF00FF00"
+                android:strokeColor="#FF00FF00"
                 android:strokeWidth="20" />
 
             <group
@@ -66,7 +62,7 @@
                     <path
                         android:name="twoLines3"
                         android:pathData="@string/twoLinePathData"
-                        android:stroke="#FF0000FF"
+                        android:strokeColor="#FF0000FF"
                         android:strokeWidth="20" />
                 </group>
             </group>
@@ -80,8 +76,8 @@
                     <path
                         android:name="twoLines2"
                         android:pathData="@string/twoLinePathData"
-                        android:fill="?android:attr/colorForeground"
-                        android:stroke="?android:attr/colorForeground"
+                        android:fillColor="?android:attr/colorForeground"
+                        android:strokeColor="?android:attr/colorForeground"
                         android:strokeWidth="20" />
                 </group>
             </group>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml
index a3f0447..069a531 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable25.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="400"
-        android:viewportWidth="400" />
+        android:viewportWidth="400" >
 
     <group
         android:name="FirstLevelGroup"
@@ -34,7 +30,7 @@
             android:translateX="-100.0"
             android:translateY="50.0" >
             <path
-                android:fill="#FF00FF00"
+                android:fillColor="#FF00FF00"
                 android:pathData="@string/rectangle200" />
 
             <group
@@ -43,7 +39,7 @@
                 android:translateX="-100.0"
                 android:translateY="50.0" >
                 <path
-                    android:fill="#FF0000FF"
+                    android:fillColor="#FF0000FF"
                     android:pathData="@string/rectangle200" />
             </group>
             <group
@@ -52,7 +48,7 @@
                 android:translateX="100.0"
                 android:translateY="50.0" >
                 <path
-                    android:fill="#FF000000"
+                    android:fillColor="#FF000000"
                     android:pathData="@string/rectangle200" />
             </group>
         </group>
@@ -62,7 +58,7 @@
             android:translateX="100.0"
             android:translateY="50.0" >
             <path
-                android:fill="#FF0000FF"
+                android:fillColor="#FF0000FF"
                 android:pathData="@string/rectangle200" />
 
             <group
@@ -71,7 +67,7 @@
                 android:translateX="-100.0"
                 android:translateY="50.0" >
                 <path
-                    android:fill="#FFFF0000"
+                    android:fillColor="#FFFF0000"
                     android:pathData="@string/rectangle200" />
             </group>
             <group
@@ -80,13 +76,13 @@
                 android:translateX="100.0"
                 android:translateY="50.0" >
                 <path
-                    android:fill="#FF00FF00"
+                    android:fillColor="#FF00FF00"
                     android:pathData="@string/rectangle200" />
             </group>
         </group>
 
         <path
-            android:fill="#FFFF0000"
+            android:fillColor="#FFFF0000"
             android:pathData="@string/rectangle200" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable_favorite.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable_favorite.xml
index 5a66e2d..7be49a9 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable_favorite.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable_favorite.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="128dp"
-        android:width="128dp" />
-
-    <viewport
+        android:width="128dp"
         android:viewportHeight="480"
-        android:viewportWidth="480" />
+        android:viewportWidth="480" >
 
     <group
         android:name="root"
@@ -29,7 +25,7 @@
         android:translateY="240.0" >
         <path
             android:name="favorite"
-            android:fill="#ff000000"
+            android:fillColor="#ff000000"
             android:pathData="M2.100006104,-6
                 C0.1449127197,-6,1.600006104,-5.975006104,0,-5.975006104
                 C-1.574996948,-5.975006104,0.00309753418,-6-1.949996948-6
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable_grouping_1.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable_grouping_1.xml
index 558de94..7839ad1 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable_grouping_1.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable_grouping_1.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="256"
-        android:viewportWidth="256" />
+        android:viewportWidth="256" >
 
     <group
         android:name="shape_layer_1"
@@ -30,7 +26,7 @@
         <group android:name="sun" >
             <path
                 android:name="ellipse_path_1"
-                android:fill="#ffff8000"
+                android:fillColor="#ffff8000"
                 android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0" />
 
             <group
@@ -38,7 +34,7 @@
                 android:translateX="75" >
                 <path
                     android:name="ellipse_path_1_1"
-                    android:fill="#ff5656ea"
+                    android:fillColor="#ff5656ea"
                     android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0" />
 
                 <group
@@ -46,7 +42,7 @@
                     android:translateX="25" >
                     <path
                         android:name="ellipse_path_1_2"
-                        android:fill="#ffadadad"
+                        android:fillColor="#ffadadad"
                         android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0" />
                 </group>
             </group>
diff --git a/tests/VectorDrawableTest/res/drawable/vector_drawable_progress_bar.xml b/tests/VectorDrawableTest/res/drawable/vector_drawable_progress_bar.xml
index f1b2996..4544cae 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_drawable_progress_bar.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_drawable_progress_bar.xml
@@ -13,15 +13,11 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="64"
-        android:viewportWidth="64" />
+        android:viewportWidth="64" >
 
     <group
         android:name="root"
@@ -37,9 +33,9 @@
             android:rotation="0" >
             <path
                 android:name="pie1"
-                android:fill="#00000000"
+                android:fillColor="#00000000"
                 android:pathData="M0, 0 m 0, -9.5 a 9.5,9.5 0 1,1 0,19 a 9.5,9.5 0 1,1 0,-19"
-                android:stroke="?android:attr/colorControlActivated"
+                android:strokeColor="?android:attr/colorControlActivated"
                 android:strokeLineCap="round"
                 android:strokeLineJoin="miter"
                 android:strokeWidth="2"
diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_create.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_create.xml
index 22ce795..0a6cedc 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_icon_create.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_icon_create.xml
@@ -13,19 +13,15 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="24"
-        android:viewportWidth="24" />
+        android:viewportWidth="24" >
 
     <group>
         <path
-            android:fill="#FF000000"
+            android:fillColor="#FF000000"
             android:pathData="M3.0,17.25L3.0,21.0l3.75,0.0L17.813995,9.936001l-3.75,-3.75L3.0,17.25zM20.707,7.0429993c0.391,-0.391 0.391,-1.023 0.0,-1.414l-2.336,-2.336c-0.391,-0.391 -1.023,-0.391 -1.414,0.0l-1.832,1.832l3.75,3.75L20.707,7.0429993z" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_delete.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_delete.xml
index 042173c..94c10df 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_icon_delete.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_icon_delete.xml
@@ -13,19 +13,15 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="24"
-        android:viewportWidth="24" />
+        android:viewportWidth="24" >
 
     <group>
         <path
-            android:fill="#FF000000"
+            android:fillColor="#FF000000"
             android:pathData="M6.0,19.0c0.0,1.104 0.896,2.0 2.0,2.0l8.0,0.0c1.104,0.0 2.0,-0.896 2.0,-2.0l0.0,-12.0L6.0,7.0L6.0,19.0zM18.0,4.0l-2.5,0.0l-1.0,-1.0l-5.0,0.0l-1.0,1.0L6.0,4.0C5.4469986,4.0 5.0,4.4469986 5.0,5.0l0.0,1.0l14.0,0.0l0.0,-1.0C19.0,4.4469986 18.552002,4.0 18.0,4.0z" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_heart.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_heart.xml
index 6b6f43d..870e508 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_icon_heart.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_icon_heart.xml
@@ -13,19 +13,15 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="24"
-        android:viewportWidth="24" />
+        android:viewportWidth="24" >
 
     <group>
         <path
-            android:fill="#FF000000"
+            android:fillColor="#FF000000"
             android:pathData="M16.0,5.0c-1.955,0.0 -3.83,1.268 -4.5,3.0c-0.67,-1.732 -2.547,-3.0 -4.5,-3.0C4.4570007,5.0 2.5,6.931999 2.5,9.5c0.0,3.529 3.793,6.258 9.0,11.5c5.207,-5.242 9.0,-7.971 9.0,-11.5C20.5,6.931999 18.543,5.0 16.0,5.0z" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_schedule.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_schedule.xml
index ba8ebca..8cabca8 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_icon_schedule.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_icon_schedule.xml
@@ -13,15 +13,11 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="24"
-        android:viewportWidth="24" />
+        android:viewportWidth="24" >
 
     <group>
         <path
diff --git a/tests/VectorDrawableTest/res/drawable/vector_icon_settings.xml b/tests/VectorDrawableTest/res/drawable/vector_icon_settings.xml
index 896a938..7bd6304 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_icon_settings.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_icon_settings.xml
@@ -13,19 +13,15 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="64dp"
-        android:width="64dp" />
-
-    <viewport
+        android:width="64dp"
         android:viewportHeight="24"
-        android:viewportWidth="24" />
+        android:viewportWidth="24" >
 
     <group>
         <path
-            android:fill="#FF000000"
+            android:fillColor="#FF000000"
             android:pathData="M19.429,12.975998c0.042,-0.32 0.07,-0.645 0.07,-0.976s-0.029,-0.655 -0.07,-0.976l2.113,-1.654c0.188,-0.151 0.243,-0.422 0.118,-0.639l-2.0,-3.463c-0.125,-0.217 -0.386,-0.304 -0.612,-0.218l-2.49,1.004c-0.516,-0.396 -1.081,-0.731 -1.69,-0.984l-0.375,-2.648C14.456,2.1829987 14.25,2.0 14.0,2.0l-4.0,0.0C9.75,2.0 9.544,2.1829987 9.506,2.422001L9.131,5.0699997C8.521,5.322998 7.957,5.6570015 7.44,6.054001L4.952,5.0509987C4.726,4.965 4.464,5.052002 4.34,5.269001l-2.0,3.463C2.2150002,8.947998 2.27,9.219002 2.4580002,9.369999l2.112,1.653C4.528,11.344002 4.5,11.668999 4.5,12.0s0.029,0.656 0.071,0.977L2.4580002,14.630001c-0.188,0.151 -0.243,0.422 -0.118,0.639l2.0,3.463c0.125,0.217 0.386,0.304 0.612,0.218l2.489,-1.004c0.516,0.396 1.081,0.731 1.69,0.984l0.375,2.648C9.544,21.817001 9.75,22.0 10.0,22.0l4.0,0.0c0.25,0.0 0.456,-0.183 0.494,-0.422l0.375,-2.648c0.609,-0.253 1.174,-0.588 1.689,-0.984l2.49,1.004c0.226,0.086 0.487,-0.001 0.612,-0.218l2.0,-3.463c0.125,-0.217 0.07,-0.487 -0.118,-0.639L19.429,12.975998zM12.0,16.0c-2.21,0.0 -4.0,-1.791 -4.0,-4.0c0.0,-2.21 1.79,-4.0 4.0,-4.0c2.208,0.0 4.0,1.79 4.0,4.0C16.0,14.209 14.208,16.0 12.0,16.0z" />
     </group>
 
diff --git a/tests/VectorDrawableTest/res/drawable/vector_test01.xml b/tests/VectorDrawableTest/res/drawable/vector_test01.xml
index fc2a15c..dd71ef0 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_test01.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_test01.xml
@@ -13,23 +13,19 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="128dp"
-        android:width="128dp" />
-
-    <viewport
+        android:width="128dp"
         android:viewportHeight="512"
-        android:viewportWidth="512" />
+        android:viewportWidth="512" >
 
     <group>
         <path
             android:name="002b"
             android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0t-200,299"
-            android:stroke="#FF0000FF"
+            android:strokeColor="#FF0000FF"
             android:strokeWidth="4"
-            android:fill="#00000000" />
+            android:fillColor="#00000000" />
     </group>
 
 </vector>
\ No newline at end of file
diff --git a/tests/VectorDrawableTest/res/drawable/vector_test02.xml b/tests/VectorDrawableTest/res/drawable/vector_test02.xml
index 9f4abbf..e4f48de 100644
--- a/tests/VectorDrawableTest/res/drawable/vector_test02.xml
+++ b/tests/VectorDrawableTest/res/drawable/vector_test02.xml
@@ -13,23 +13,19 @@
 See the License for the specific language governing permissions and
 limitations under the License.
 -->
-<vector xmlns:android="http://schemas.android.com/apk/res/android" >
-
-    <size
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
         android:height="128dp"
-        android:width="128dp" />
-
-    <viewport
+        android:width="128dp"
         android:viewportHeight="512"
-        android:viewportWidth="512" />
+        android:viewportWidth="512" >
 
     <group>
         <path
             android:name="002b"
             android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0T-200,299"
-            android:stroke="#FF0000FF"
+            android:strokeColor="#FF0000FF"
             android:strokeWidth="4"
-            android:fill="#00000000" />
+            android:fillColor="#00000000" />
     </group>
 
 </vector>
\ No newline at end of file
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
index 70a7be8..03b5211 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeContext.java
@@ -619,39 +619,36 @@
             }
 
             if (value != null) {
-                if ((value.getFirst() == ResourceType.STYLE)
-                        || (value.getFirst() == ResourceType.ATTR)) {
-                    // look for the style in the current theme, and its parent:
-                    ResourceValue item = mRenderResources.findItemInTheme(value.getSecond(),
+                if ((value.getFirst() == ResourceType.STYLE)) {
+                    // look for the style in all resources:
+                    StyleResourceValue item = mRenderResources.getStyle(value.getSecond(),
                             isFrameworkRes);
                     if (item != null) {
-                        if (item instanceof StyleResourceValue) {
-                            if (defaultPropMap != null) {
-                                defaultPropMap.put("style", item.getName());
-                            }
-
-                            defStyleValues = (StyleResourceValue)item;
+                        if (defaultPropMap != null) {
+                            defaultPropMap.put("style", item.getName());
                         }
+
+                        defStyleValues = item;
                     } else {
                         Bridge.getLog().error(null,
                                 String.format(
                                         "Style with id 0x%x (resolved to '%s') does not exist.",
                                         defStyleRes, value.getSecond()),
-                                null /*data*/);
+                                null);
                     }
                 } else {
                     Bridge.getLog().error(null,
                             String.format(
-                                    "Resouce id 0x%x is not of type STYLE (instead %s)",
+                                    "Resource id 0x%x is not of type STYLE (instead %s)",
                                     defStyleRes, value.getFirst().toString()),
-                            null /*data*/);
+                            null);
                 }
             } else {
                 Bridge.getLog().error(null,
                         String.format(
                                 "Failed to find style with id 0x%x in current theme",
                                 defStyleRes),
-                        null /*data*/);
+                        null);
             }
         }
 
diff --git a/tools/obbtool/Android.mk b/tools/obbtool/Android.mk
index 9ff56d6..99a5671 100644
--- a/tools/obbtool/Android.mk
+++ b/tools/obbtool/Android.mk
@@ -13,7 +13,7 @@
 LOCAL_SRC_FILES := \
 	Main.cpp
 
-LOCAL_CFLAGS := -Wall -Werror
+LOCAL_CFLAGS := -Wall -Werror -Wno-mismatched-tags
 
 #LOCAL_C_INCLUDES +=
 
@@ -36,7 +36,7 @@
 
 LOCAL_MODULE := pbkdf2gen
 LOCAL_MODULE_TAGS := optional
-LOCAL_CFLAGS := -Wall -Werror
+LOCAL_CFLAGS := -Wall -Werror -Wno-mismatched-tags
 LOCAL_SRC_FILES := pbkdf2gen.cpp
 LOCAL_LDLIBS += -ldl
 LOCAL_C_INCLUDES := external/openssl/include $(LOCAL_C_INCLUDES)
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index 50fd260..57343c5 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -2,16 +2,20 @@
 
 import android.annotation.SystemApi;
 import android.content.Context;
+import android.os.Bundle;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
 import android.os.Messenger;
+import android.os.Parcel;
+import android.os.Parcelable;
 import android.os.RemoteException;
 import android.util.Log;
 import android.util.SparseArray;
 
 import com.android.internal.util.AsyncChannel;
+import com.android.internal.util.Protocol;
 
 import java.util.concurrent.CountDownLatch;
 
@@ -51,12 +55,15 @@
     public static final int RTT_STATUS_ABORTED                  = 8;
 
     public static final int REASON_UNSPECIFIED              = -1;
-    public static final int REASON_INVALID_LISTENER         = -2;
-    public static final int REASON_INVALID_REQUEST          = -3;
+    public static final int REASON_NOT_AVAILABLE            = -2;
+    public static final int REASON_INVALID_LISTENER         = -3;
+    public static final int REASON_INVALID_REQUEST          = -4;
+
+    public static final String DESCRIPTION_KEY  = "android.net.wifi.RttManager.Description";
 
     public class Capabilities {
-        int supportedType;
-        int supportedPeerType;
+        public int supportedType;
+        public int supportedPeerType;
     }
 
     public Capabilities getCapabilities() {
@@ -91,6 +98,73 @@
         public int num_retries;
     }
 
+    /** pseudo-private class used to parcel arguments */
+    public static class ParcelableRttParams implements Parcelable {
+
+        public RttParams mParams[];
+
+        ParcelableRttParams(RttParams[] params) {
+            mParams = params;
+        }
+
+        /** Implement the Parcelable interface {@hide} */
+        public int describeContents() {
+            return 0;
+        }
+
+        /** Implement the Parcelable interface {@hide} */
+        public void writeToParcel(Parcel dest, int flags) {
+            if (mParams != null) {
+                dest.writeInt(mParams.length);
+
+                for (RttParams params : mParams) {
+                    dest.writeInt(params.deviceType);
+                    dest.writeInt(params.requestType);
+                    dest.writeString(params.bssid);
+                    dest.writeInt(params.frequency);
+                    dest.writeInt(params.channelWidth);
+                    dest.writeInt(params.num_samples);
+                    dest.writeInt(params.num_retries);
+                }
+            } else {
+                dest.writeInt(0);
+            }
+        }
+
+        /** Implement the Parcelable interface {@hide} */
+        public static final Creator<ParcelableRttParams> CREATOR =
+                new Creator<ParcelableRttParams>() {
+                    public ParcelableRttParams createFromParcel(Parcel in) {
+
+                        int num = in.readInt();
+
+                        if (num == 0) {
+                            return new ParcelableRttParams(null);
+                        }
+
+                        RttParams params[] = new RttParams[num];
+                        for (int i = 0; i < num; i++) {
+                            params[i] = new RttParams();
+                            params[i].deviceType = in.readInt();
+                            params[i].requestType = in.readInt();
+                            params[i].bssid = in.readString();
+                            params[i].frequency = in.readInt();
+                            params[i].channelWidth = in.readInt();
+                            params[i].num_samples = in.readInt();
+                            params[i].num_retries = in.readInt();
+
+                        }
+
+                        ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
+                        return parcelableParams;
+                    }
+
+                    public ParcelableRttParams[] newArray(int size) {
+                        return new ParcelableRttParams[size];
+                    }
+                };
+    }
+
     /** specifies RTT results */
     public static class RttResult {
         /** mac address of the device being ranged */
@@ -99,6 +173,9 @@
         /** status of the request */
         public int status;
 
+        /** type of the request used */
+        public int requestType;
+
         /** timestamp of completion, in microsecond since boot */
         public long ts;
 
@@ -121,24 +198,105 @@
         public long rtt_spread_ns;
 
         /** average distance in centimeter, computed based on rtt_ns */
-        public long distance_cm;
+        public int distance_cm;
 
         /** standard deviation observed in distance */
-        public long distance_sd_cm;
+        public int distance_sd_cm;
 
         /** spread (i.e. max - min) distance */
-        public long distance_spread_cm;
+        public int distance_spread_cm;
     }
 
+
+    /** pseudo-private class used to parcel results */
+    public static class ParcelableRttResults implements Parcelable {
+
+        public RttResult mResults[];
+
+        public ParcelableRttResults(RttResult[] results) {
+            mResults = results;
+        }
+
+        /** Implement the Parcelable interface {@hide} */
+        public int describeContents() {
+            return 0;
+        }
+
+        /** Implement the Parcelable interface {@hide} */
+        public void writeToParcel(Parcel dest, int flags) {
+            if (mResults != null) {
+                dest.writeInt(mResults.length);
+                for (RttResult result : mResults) {
+                    dest.writeString(result.bssid);
+                    dest.writeInt(result.status);
+                    dest.writeInt(result.requestType);
+                    dest.writeLong(result.ts);
+                    dest.writeInt(result.rssi);
+                    dest.writeInt(result.rssi_spread);
+                    dest.writeInt(result.tx_rate);
+                    dest.writeLong(result.rtt_ns);
+                    dest.writeLong(result.rtt_sd_ns);
+                    dest.writeLong(result.rtt_spread_ns);
+                    dest.writeInt(result.distance_cm);
+                    dest.writeInt(result.distance_sd_cm);
+                    dest.writeInt(result.distance_spread_cm);
+                }
+            } else {
+                dest.writeInt(0);
+            }
+        }
+
+        /** Implement the Parcelable interface {@hide} */
+        public static final Creator<ParcelableRttResults> CREATOR =
+                new Creator<ParcelableRttResults>() {
+                    public ParcelableRttResults createFromParcel(Parcel in) {
+
+                        int num = in.readInt();
+
+                        if (num == 0) {
+                            return new ParcelableRttResults(null);
+                        }
+
+                        RttResult results[] = new RttResult[num];
+                        for (int i = 0; i < num; i++) {
+                            results[i] = new RttResult();
+                            results[i].bssid = in.readString();
+                            results[i].status = in.readInt();
+                            results[i].requestType = in.readInt();
+                            results[i].ts = in.readLong();
+                            results[i].rssi = in.readInt();
+                            results[i].rssi_spread = in.readInt();
+                            results[i].tx_rate = in.readInt();
+                            results[i].rtt_ns = in.readLong();
+                            results[i].rtt_sd_ns = in.readLong();
+                            results[i].rtt_spread_ns = in.readLong();
+                            results[i].distance_cm = in.readInt();
+                            results[i].distance_sd_cm = in.readInt();
+                            results[i].distance_spread_cm = in.readInt();
+                        }
+
+                        ParcelableRttResults parcelableResults = new ParcelableRttResults(results);
+                        return parcelableResults;
+                    }
+
+                    public ParcelableRttResults[] newArray(int size) {
+                        return new ParcelableRttResults[size];
+                    }
+                };
+    }
+
+
     public static interface RttListener {
-        public void onSuccess(RttResult results[]);
+        public void onSuccess(RttResult[] results);
         public void onFailure(int reason, String description);
         public void onAborted();
     }
 
-    public void startRanging(RttParams params[], RttListener listener) {
+    public void startRanging(RttParams[] params, RttListener listener) {
         validateChannel();
-        sAsyncChannel.sendMessage(CMD_OP_START_RANGING, 0, removeListener(listener), params);
+        ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
+        sAsyncChannel.sendMessage(CMD_OP_START_RANGING,
+                0, putListener(listener), parcelableParams);
     }
 
     public void stopRanging(RttListener listener) {
@@ -147,11 +305,13 @@
     }
 
     /* private methods */
-    public static final int CMD_OP_START_RANGING        = 0;
-    public static final int CMD_OP_STOP_RANGING         = 1;
-    public static final int CMD_OP_FAILED               = 2;
-    public static final int CMD_OP_SUCCEEDED            = 3;
-    public static final int CMD_OP_ABORTED              = 4;
+    public static final int BASE = Protocol.BASE_WIFI_RTT_MANAGER;
+
+    public static final int CMD_OP_START_RANGING        = BASE + 0;
+    public static final int CMD_OP_STOP_RANGING         = BASE + 1;
+    public static final int CMD_OP_FAILED               = BASE + 2;
+    public static final int CMD_OP_SUCCEEDED            = BASE + 3;
+    public static final int CMD_OP_ABORTED              = BASE + 4;
 
     private Context mContext;
     private IRttManager mService;
@@ -173,7 +333,7 @@
      * Create a new WifiScanner instance.
      * Applications will almost always want to use
      * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
-     * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}.
+     * the standard {@link android.content.Context#WIFI_RTT_SERVICE Context.WIFI_RTT_SERVICE}.
      * @param context the application context
      * @param service the Binder interface
      * @hide
@@ -190,6 +350,7 @@
             if (++sThreadRefCount == 1) {
                 Messenger messenger = null;
                 try {
+                    Log.d(TAG, "Get the messenger from " + mService);
                     messenger = mService.getMessenger();
                 } catch (RemoteException e) {
                     /* do nothing */
@@ -313,10 +474,11 @@
             switch (msg.what) {
                 /* ActionListeners grouped together */
                 case CMD_OP_SUCCEEDED :
-                    ((RttListener) listener).onSuccess((RttResult[])msg.obj);
+                    reportSuccess(listener, msg);
+                    removeListener(msg.arg2);
                     break;
                 case CMD_OP_FAILED :
-                    ((RttListener) listener).onFailure(msg.arg1, (String)msg.obj);
+                    reportFailure(listener, msg);
                     removeListener(msg.arg2);
                     break;
                 case CMD_OP_ABORTED :
@@ -328,6 +490,18 @@
                     return;
             }
         }
+
+        void reportSuccess(Object listener, Message msg) {
+            RttListener rttListener = (RttListener) listener;
+            ParcelableRttResults parcelableResults = (ParcelableRttResults) msg.obj;
+            ((RttListener) listener).onSuccess(parcelableResults.mResults);
+        }
+
+        void reportFailure(Object listener, Message msg) {
+            RttListener rttListener = (RttListener) listener;
+            Bundle bundle = (Bundle) msg.obj;
+            ((RttListener) listener).onFailure(msg.arg1, bundle.getString(DESCRIPTION_KEY));
+        }
     }
 
 }