Merge "Print driving status and keyboard status in the kitchenSink for testing." into nyc-car-dev
diff --git a/car-lib/Android.mk b/car-lib/Android.mk
index e413a90..e1f4105 100644
--- a/car-lib/Android.mk
+++ b/car-lib/Android.mk
@@ -28,6 +28,10 @@
 
 include $(BUILD_JAVA_LIBRARY)
 
+ifeq ($(BOARD_IS_AUTOMOTIVE), true)
+$(call dist-for-goals,dist_files,$(LOCAL_BUILT_MODULE):$(LOCAL_MODULE).jar)
+endif
+
 # API Check
 # ---------------------------------------------
 car_module := $(LOCAL_MODULE)
diff --git a/car-lib/api/system-current.txt b/car-lib/api/system-current.txt
index 5835530..28751cd 100644
--- a/car-lib/api/system-current.txt
+++ b/car-lib/api/system-current.txt
@@ -591,9 +591,9 @@
     field public static final int HVAC_ZONED_FAN_SPEED_SETPOINT = 16388; // 0x4004
     field public static final int HVAC_ZONED_SEAT_TEMP = 16392; // 0x4008
     field public static final int HVAC_ZONED_TEMP_ACTUAL = 16386; // 0x4002
-    field public static final int HVAC_ZONED_TEMP_IS_FARENHEIT = 16387; // 0x4003
+    field public static final int HVAC_ZONED_TEMP_IS_FAHRENHEIT = 16387; // 0x4003
     field public static final int HVAC_ZONED_TEMP_SETPOINT = 16385; // 0x4001
-    field public static final int MAX_GLOBAL_PROPETY_ID = 16383; // 0x3fff
+    field public static final int MAX_GLOBAL_PROPERTY_ID = 16383; // 0x3fff
     field public static final int PROPERTY_TYPE_BOOLEAN = 0; // 0x0
     field public static final int PROPERTY_TYPE_FLOAT = 1; // 0x1
     field public static final int PROPERTY_TYPE_FLOAT_VECTOR = 4; // 0x4
@@ -705,7 +705,7 @@
     method public int getPresetCount();
     method public synchronized void registerListener(android.car.hardware.radio.CarRadioManager.CarRadioEventListener) throws android.car.CarNotConnectedException;
     method public boolean setPreset(android.car.hardware.radio.CarRadioPreset) throws java.lang.IllegalArgumentException;
-    method public synchronized void unregisterListner();
+    method public synchronized void unregisterListener();
     field public static final boolean DBG = true;
     field public static final java.lang.String TAG = "CarRadioManager";
   }
diff --git a/car-lib/src/android/car/Car.java b/car-lib/src/android/car/Car.java
index fbe455b..4153765 100644
--- a/car-lib/src/android/car/Car.java
+++ b/car-lib/src/android/car/Car.java
@@ -155,8 +155,9 @@
     @SystemApi
     public static final String PERMISSION_CAR_RADIO = "android.car.permission.CAR_RADIO";
 
+
     /**
-     * Permission necesary to access Car PRJECTION system APIs.
+     * Permission necessary to access Car PROJECTION system APIs.
      * @hide
      */
     @SystemApi
diff --git a/car-lib/src/android/car/CarAppContextManager.java b/car-lib/src/android/car/CarAppContextManager.java
index acff12a..ba165dc 100644
--- a/car-lib/src/android/car/CarAppContextManager.java
+++ b/car-lib/src/android/car/CarAppContextManager.java
@@ -51,7 +51,7 @@
         /**
          * Lost ownership for the context, which happens when other app has set the context.
          * The app losing context should stop the action associated with the context.
-         * For example, navigaiton app currently running active navigation should stop navigation
+         * For example, navigation app currently running active navigation should stop navigation
          * upon getting this for {@link CarAppContextManager#APP_CONTEXT_NAVIGATION}.
          * @param context
          */
@@ -89,14 +89,14 @@
         mService = IAppContext.Stub.asInterface(service);
         mHandler = new Handler(looper);
         mBinderListener = new IAppContextListenerImpl(this);
-        mOwnershipListeners = new HashMap<Integer, AppContextOwnershipChangeListener>();
+        mOwnershipListeners = new HashMap<>();
     }
 
     /**
      * Register listener to monitor app context change. Only one listener can be registered and
      * registering multiple times will lead into only the last listener to be active.
      * @param listener
-     * @param contextFilter Flags of cotexts to get notification.
+     * @param contextFilter Flags of contexts to get notification.
      */
     public void registerContextListener(AppContextChangeListener listener, int contextFilter) {
         if (listener == null) {
@@ -117,7 +117,7 @@
 
     /**
      * Unregister listener and stop listening context change events. If app has owned a context
-     * by {@link #setActiveContext(int)}, it will be reset to inactive state.
+     * by {@link #resetActiveContexts(int)}, it will be reset to inactive state.
      */
     public void unregisterContextListener() {
         synchronized(this) {
diff --git a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
index 6595289..bc36ffb 100644
--- a/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
+++ b/car-lib/src/android/car/hardware/hvac/CarHvacManager.java
@@ -77,7 +77,7 @@
     /**
      * The maximum id that can be assigned to global (non-zoned) property.
      */
-    public static final int MAX_GLOBAL_PROPETY_ID        = 0x3fff;
+    public static final int MAX_GLOBAL_PROPERTY_ID       = 0x3fff;
 
     /**
      * HVAC_ZONED_* represents properties available on a per-zone basis.  All zones in a car are
@@ -93,9 +93,9 @@
      */
     public static final int HVAC_ZONED_TEMP_ACTUAL               = 0x4002;
     /**
-     * Temperature is in degrees farenheit if this is true, bool.
+     * Temperature is in degrees fahrenheit if this is true, bool.
      */
-    public static final int HVAC_ZONED_TEMP_IS_FARENHEIT         = 0x4003;
+    public static final int HVAC_ZONED_TEMP_IS_FAHRENHEIT        = 0x4003;
     /**
      * Fan speed setpoint is an integer from 0-n, depending on the number of fan speeds available.
      * Selection determines the fan position, int.
@@ -159,7 +159,7 @@
          * Tells if the given property is zoned property or global property
          */
         public boolean isZonedProperty() {
-            return mPropertyId > MAX_GLOBAL_PROPETY_ID;
+            return mPropertyId > MAX_GLOBAL_PROPERTY_ID;
         }
 
         /**
@@ -371,7 +371,6 @@
     }
 
     private final ICarHvac mService;
-    private final Object mLock = new Object();
     private CarHvacEventListener mListener = null;
     private CarHvacEventListenerToService mListenerToService = null;
 
@@ -380,7 +379,7 @@
 
         EventCallbackHandler(CarHvacManager mgr, Looper looper) {
             super(looper);
-            mMgr = new WeakReference<CarHvacManager>(mgr);
+            mMgr = new WeakReference<>(mgr);
         }
 
         @Override
@@ -405,7 +404,7 @@
         private final WeakReference<CarHvacManager> mManager;
 
         public CarHvacEventListenerToService(CarHvacManager manager) {
-            mManager = new WeakReference<CarHvacManager>(manager);
+            mManager = new WeakReference<>(manager);
         }
 
         @Override
@@ -429,7 +428,7 @@
     }
 
     public static boolean isZonedProperty(int propertyId) {
-        return propertyId > MAX_GLOBAL_PROPETY_ID;
+        return propertyId > MAX_GLOBAL_PROPERTY_ID;
     }
 
     /**
@@ -441,7 +440,7 @@
     public synchronized void registerListener(CarHvacEventListener listener)
             throws CarNotConnectedException {
         if (mListener != null) {
-            throw new IllegalStateException("Listner already registered. Did you call " +
+            throw new IllegalStateException("Listener already registered. Did you call " +
                 "registerListener() twice?");
         }
 
@@ -485,8 +484,8 @@
      * (CarHvacBooleanProperty, CarHvacFloatProperty, CarrHvacIntProperty)
      */
     public List<CarHvacBaseProperty> getPropertyList() {
-        List<CarHvacBaseProperty> hvacProps = new ArrayList<CarHvacBaseProperty>();
-        List<CarHvacProperty> carProps = null;
+        List<CarHvacBaseProperty> hvacProps = new ArrayList<>();
+        List<CarHvacProperty> carProps;
         try {
             carProps = mService.getHvacProperties();
         } catch (RemoteException e) {
@@ -526,7 +525,7 @@
      * @return
      */
     public boolean getBooleanProperty(int prop, int zone) {
-        CarHvacProperty carProp = null;
+        CarHvacProperty carProp;
         if (DBG) {
             Log.d(TAG, "getBooleanProperty:  prop = " + prop + " zone = " + zone);
         }
@@ -552,7 +551,7 @@
      * @return
      */
     public float getFloatProperty(int prop, int zone) {
-        CarHvacProperty carProp = null;
+        CarHvacProperty carProp;
         if (DBG) {
             Log.d(TAG, "getFloatProperty:  prop = " + prop + " zone = " + zone);
         }
diff --git a/car-lib/src/android/car/hardware/radio/CarRadioManager.java b/car-lib/src/android/car/hardware/radio/CarRadioManager.java
index 246dc70..86effe2 100644
--- a/car-lib/src/android/car/hardware/radio/CarRadioManager.java
+++ b/car-lib/src/android/car/hardware/radio/CarRadioManager.java
@@ -56,7 +56,6 @@
     private CarRadioEventListener mListener = null;
     @GuardedBy("this")
     private CarRadioEventListenerToService mListenerToService = null;
-    private int mServiceVersion;
     private static final class EventCallbackHandler extends Handler {
         WeakReference<CarRadioManager> mMgr;
 
@@ -133,7 +132,7 @@
     public synchronized void registerListener(CarRadioEventListener listener)
             throws CarNotConnectedException {
         if (mListener != null) {
-            throw new IllegalStateException("Listner already registered. Did you call " +
+            throw new IllegalStateException("Listener already registered. Did you call " +
                 "registerListener() twice?");
         }
 
@@ -153,9 +152,9 @@
     /**
      * Unregister {@link CarRadioEventListener}.
      */
-    public synchronized void unregisterListner() {
+    public synchronized void unregisterListener() {
         if (DBG) {
-            Log.d(TAG, "unregisterListenr");
+            Log.d(TAG, "unregisterListener");
         }
         try {
             mService.unregisterListener(mListenerToService);
@@ -196,8 +195,8 @@
     /**
      * Set the preset value to a specific radio preset.
      *
-     * In order to ensure that the preset value indeed get updated, wait for event on the listner
-     * registered via registerListner().
+     * In order to ensure that the preset value indeed get updated, wait for event on the listener
+     * registered via registerListener().
      *
      * @return: {@link boolean} value which returns true if the request succeeded and false
      * otherwise. Common reasons for the failure could be:
@@ -206,19 +205,16 @@
      * request succeeded.
      */
     public boolean setPreset(CarRadioPreset preset) throws IllegalArgumentException {
-        boolean status = false;
         try {
-            status = mService.setPreset(preset);
-
+            return mService.setPreset(preset);
         } catch (RemoteException ex) {
             // do nothing.
             return false;
         }
-        return status;
     }
 
     private void dispatchEventToClient(CarRadioEvent event) {
-        CarRadioEventListener listener = null;
+        CarRadioEventListener listener;
         synchronized (this) {
             listener = mListener;
         }
diff --git a/car-support-lib/Android.mk b/car-support-lib/Android.mk
index c5243ce..345c430 100644
--- a/car-support-lib/Android.mk
+++ b/car-support-lib/Android.mk
@@ -19,6 +19,39 @@
 
 LOCAL_PATH:= $(call my-dir)
 
+#Build prebuilt android.support.car library
+include $(CLEAR_VARS)
+
+LOCAL_AAPT_FLAGS := --auto-add-overlay \
+    --extra-packages android.support.v7.appcompat \
+    --extra-packages android.support.v7.recyclerview \
+    --extra-packages android.support.v7.cardview
+
+LOCAL_MODULE := android.support.car-prebuilt
+
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/appcompat/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/recyclerview/res
+LOCAL_RESOURCE_DIR += frameworks/support/v7/cardview/res
+LOCAL_SDK_VERSION := current
+
+LOCAL_MANIFEST_FILE := AndroidManifest.xml
+
+LOCAL_SRC_FILES := $(call all-java-files-under, src) $(call all-Iaidl-files-under, src)
+
+LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \
+                               android-support-v7-appcompat \
+                               android-support-v7-recyclerview \
+                               android-support-v7-cardview
+
+LOCAL_JAVA_LIBRARIES += android.car
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+ifeq ($(BOARD_IS_AUTOMOTIVE), true)
+$(call dist-for-goals,dist_files,$(built_aar):android.support.car.aar)
+endif
+
 # Build the resources.
 include $(CLEAR_VARS)
 LOCAL_MODULE := android.support.car-res
@@ -51,8 +84,7 @@
 LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4 \
                                android-support-v7-appcompat \
                                android-support-v7-recyclerview \
-                               android-support-v7-cardview \
-                               jsr305
+                               android-support-v7-cardview
 
 LOCAL_JAVA_LIBRARIES += android.car \
                         android.support.car-res
@@ -65,7 +97,7 @@
 car_module_src_files := $(LOCAL_SRC_FILES)
 car_module_api_dir := $(LOCAL_PATH)/api
 car_module_java_libraries := $(LOCAL_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_LIBRARIES) framework
-car_module_java_packages := android.support.car.*
+car_module_java_packages := android.support.car*
 include $(CAR_API_CHECK)
 
 endif #TARGET_BUILD_PDK
diff --git a/car-support-lib/api/current.txt b/car-support-lib/api/current.txt
index 0e740a8..b6f07dd 100644
--- a/car-support-lib/api/current.txt
+++ b/car-support-lib/api/current.txt
@@ -1,3 +1,103 @@
+package android.support.car {
+
+  public class Car {
+    method public void connect() throws java.lang.IllegalStateException;
+    method public static android.support.car.Car createCar(android.content.Context, android.support.car.ServiceConnectionListener, android.os.Looper);
+    method public static android.support.car.Car createCar(android.content.Context, android.support.car.ServiceConnectionListener);
+    method public void disconnect();
+    method public int getCarConnectionType() throws android.support.car.CarNotConnectedException;
+    method public java.lang.Object getCarManager(java.lang.String) throws android.support.car.CarNotConnectedException, android.support.car.CarNotSupportedException;
+    method public boolean isConnected();
+    method public boolean isConnectedToCar();
+    method public boolean isConnecting();
+    method public void registerCarConnectionListener(android.support.car.CarConnectionListener) throws android.support.car.CarNotConnectedException, java.lang.IllegalStateException;
+    method public void unregisterCarConnectionListener(android.support.car.CarConnectionListener);
+    field public static final java.lang.String APP_CONTEXT_SERVICE = "app_context";
+    field public static final java.lang.String AUDIO_SERVICE = "audio";
+    field public static final int CONNECTION_TYPE_ADB_EMULATOR = 4; // 0x4
+    field public static final int CONNECTION_TYPE_EMBEDDED = 5; // 0x5
+    field public static final int CONNECTION_TYPE_EMULATOR = 0; // 0x0
+    field public static final int CONNECTION_TYPE_ON_DEVICE_EMULATOR = 3; // 0x3
+    field public static final int CONNECTION_TYPE_UNKNOWN = -1; // 0xffffffff
+    field public static final int CONNECTION_TYPE_USB = 1; // 0x1
+    field public static final int CONNECTION_TYPE_WIFI = 2; // 0x2
+    field public static final java.lang.String INFO_SERVICE = "info";
+    field public static final java.lang.String PACKAGE_SERVICE = "package";
+    field public static final java.lang.String PERMISSION_FUEL = "android.car.permission.CAR_FUEL";
+    field public static final java.lang.String PERMISSION_MILEAGE = "android.car.permission.CAR_MILEAGE";
+    field public static final java.lang.String PERMISSION_SPEED = "android.car.permission.CAR_SPEED";
+    field public static final java.lang.String PERMISSION_VENDOR_EXTENSION = "android.car.permission.CAR_VENDOR_EXTENSION";
+    field public static final java.lang.String SENSOR_SERVICE = "sensor";
+  }
+
+  public abstract class CarAppContextManager {
+    ctor public CarAppContextManager();
+    method public abstract int getActiveAppContexts();
+    method public abstract boolean isOwningContext(int);
+    method public abstract void registerContextListener(android.support.car.CarAppContextManager.AppContextChangeListener, int);
+    method public abstract void resetActiveContexts(int);
+    method public abstract void setActiveContexts(android.support.car.CarAppContextManager.AppContextOwnershipChangeListener, int) throws java.lang.IllegalStateException, java.lang.SecurityException;
+    method public abstract void unregisterContextListener();
+    field public static final int APP_CONTEXT_NAVIGATION = 1; // 0x1
+    field public static final int APP_CONTEXT_VOICE_COMMAND = 2; // 0x2
+  }
+
+  public static abstract interface CarAppContextManager.AppContextChangeListener {
+    method public abstract void onAppContextChange(int);
+  }
+
+  public static abstract interface CarAppContextManager.AppContextOwnershipChangeListener {
+    method public abstract void onAppContextOwnershipLoss(int);
+  }
+
+  public abstract interface CarConnectionListener {
+    method public abstract void onConnected(int);
+    method public abstract void onDisconnected();
+  }
+
+  public abstract class CarInfoManager {
+    ctor public CarInfoManager();
+    method public abstract java.lang.Float getFloat(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+    method public abstract java.lang.Integer getInt(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+    method public abstract java.lang.Long getLong(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+    method public abstract java.lang.String getString(java.lang.String) throws android.support.car.CarNotConnectedException, java.lang.IllegalArgumentException;
+    field public static final int DRIVER_SIDE_CENTER = 2; // 0x2
+    field public static final int DRIVER_SIDE_LEFT = 0; // 0x0
+    field public static final int DRIVER_SIDE_RIGHT = 1; // 0x1
+    field public static final java.lang.String KEY_DRIVER_POSITION = "driverPosition";
+    field public static final java.lang.String KEY_HEAD_UNIT_MAKE = "headUnitMake";
+    field public static final java.lang.String KEY_HEAD_UNIT_MODEL = "headUnitModel";
+    field public static final java.lang.String KEY_HEAD_UNIT_SOFTWARE_BUILD = "headUnitSoftwareBuild";
+    field public static final java.lang.String KEY_HEAD_UNIT_SOFTWARE_VERSION = "headUnitSoftwareVersion";
+    field public static final java.lang.String KEY_MANUFACTURER = "manufacturer";
+    field public static final java.lang.String KEY_MODEL = "model";
+    field public static final java.lang.String KEY_MODEL_YEAR = "model-year";
+    field public static final java.lang.String KEY_VEHICLE_ID = "vehicle-id";
+  }
+
+  public class CarNotConnectedException extends java.lang.Exception {
+    ctor public CarNotConnectedException();
+    ctor public CarNotConnectedException(java.lang.String);
+    ctor public CarNotConnectedException(java.lang.String, java.lang.Throwable);
+    ctor public CarNotConnectedException(java.lang.Exception);
+  }
+
+  public class CarNotSupportedException extends java.lang.Exception {
+    ctor public CarNotSupportedException();
+    ctor public CarNotSupportedException(java.lang.String);
+    ctor public CarNotSupportedException(java.lang.String, java.lang.Throwable);
+    ctor public CarNotSupportedException(java.lang.Exception);
+  }
+
+  public abstract interface ServiceConnectionListener {
+    method public abstract void onServiceConnected(android.content.ComponentName);
+    method public abstract void onServiceConnectionFailed(int);
+    method public abstract void onServiceDisconnected(android.content.ComponentName);
+    method public abstract void onServiceSuspended(int);
+  }
+
+}
+
 package android.support.car.annotation {
 
   public abstract class ValueTypeDef implements java.lang.annotation.Annotation {
diff --git a/car-support-lib/src/android/support/car/Car.java b/car-support-lib/src/android/support/car/Car.java
index fee3930..6218288 100644
--- a/car-support-lib/src/android/support/car/Car.java
+++ b/car-support-lib/src/android/support/car/Car.java
@@ -39,8 +39,6 @@
 import java.util.HashSet;
 import java.util.LinkedList;
 
-import javax.annotation.concurrent.GuardedBy;
-
 /**
  *   Top level car API.
  *   This API works only for device with {@link PackageManager#FEATURE_AUTOMOTIVE} feature
@@ -82,6 +80,8 @@
     public static final int CONNECTION_TYPE_ADB_EMULATOR = 4;
     /** Type of car connection: platform runs directly in car. */
     public static final int CONNECTION_TYPE_EMBEDDED = 5;
+    /** Unknown type.  The support lib is likely out of date.*/
+    public static final int CONNECTION_TYPE_UNKNOWN = -1;
     /**
      * Type of car connection: platform runs directly in car but with mocked vehicle hal.
      * This will only happen in testing environment.
@@ -91,7 +91,8 @@
 
     /** @hide */
     @IntDef({CONNECTION_TYPE_EMULATOR, CONNECTION_TYPE_USB, CONNECTION_TYPE_WIFI,
-        CONNECTION_TYPE_ON_DEVICE_EMULATOR, CONNECTION_TYPE_ADB_EMULATOR, CONNECTION_TYPE_EMBEDDED})
+        CONNECTION_TYPE_ON_DEVICE_EMULATOR, CONNECTION_TYPE_ADB_EMULATOR,
+            CONNECTION_TYPE_EMBEDDED, CONNECTION_TYPE_UNKNOWN})
     @Retention(RetentionPolicy.SOURCE)
     public @interface ConnectionType {}
 
@@ -142,7 +143,7 @@
     private static final int STATE_DISCONNECTED = 0;
     private static final int STATE_CONNECTING = 1;
     private static final int STATE_CONNECTED = 2;
-    @GuardedBy("this")
+    // @GuardedBy("this")
     private int mConnectionState;
 
     private final ServiceConnectionListener mServiceConnectionListener =
@@ -176,7 +177,7 @@
 
     private final ServiceConnectionListener mServiceConnectionListenerClient;
     private final Object mCarManagerLock = new Object();
-    @GuardedBy("mCarManagerLock")
+    //@GuardedBy("mCarManagerLock")
     private final HashMap<String, CarManagerBase> mServiceMap = new HashMap<>();
     private final CarServiceLoader mCarServiceLoader;
 
diff --git a/car-support-lib/src/android/support/car/CarAppContextManager.java b/car-support-lib/src/android/support/car/CarAppContextManager.java
index c9e7f2e..865150c 100644
--- a/car-support-lib/src/android/support/car/CarAppContextManager.java
+++ b/car-support-lib/src/android/support/car/CarAppContextManager.java
@@ -42,7 +42,7 @@
         /**
          * Lost ownership for the context, which happens when other app has set the context.
          * The app losing context should stop the action associated with the context.
-         * For example, navigaiton app currently running active navigation should stop navigation
+         * For example, navigation app currently running active navigation should stop navigation
          * upon getting this for {@link CarAppContextManager#APP_CONTEXT_NAVIGATION}.
          * @param context
          */
diff --git a/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java b/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java
index 6412119..ff289bc 100644
--- a/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java
+++ b/car-support-lib/src/android/support/car/CarAppContextManagerEmbedded.java
@@ -16,8 +16,6 @@
 
 package android.support.car;
 
-import android.os.Looper;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -36,7 +34,7 @@
      */
     CarAppContextManagerEmbedded(Object manager) {
         mManager = (android.car.CarAppContextManager) manager;
-        mOwnershipListeners = new HashMap<Integer, AppContextOwnershipChangeListenerProxy>();
+        mOwnershipListeners = new HashMap<>();
     }
 
     @Override
diff --git a/car-support-lib/src/android/support/car/CarInfoManager.java b/car-support-lib/src/android/support/car/CarInfoManager.java
index 78eacac..b40f7d3 100644
--- a/car-support-lib/src/android/support/car/CarInfoManager.java
+++ b/car-support-lib/src/android/support/car/CarInfoManager.java
@@ -54,22 +54,50 @@
     @ValueTypeDef(type = String.class)
     public static final String KEY_VEHICLE_ID = "vehicle-id";
 
+    /** Manufacturer of the head unit.*/
+    @ValueTypeDef(type = String.class)
+    public static final String KEY_HEAD_UNIT_MAKE = "headUnitMake";
+    /** Model of the head unit.*/
+    @ValueTypeDef(type = String.class)
+    public static final String KEY_HEAD_UNIT_MODEL = "headUnitModel";
+    /** Head Unit software build */
+    @ValueTypeDef(type = String.class)
+    public static final String KEY_HEAD_UNIT_SOFTWARE_BUILD = "headUnitSoftwareBuild";
+    /** Head Unit software version */
+    @ValueTypeDef(type = String.class)
+    public static final String KEY_HEAD_UNIT_SOFTWARE_VERSION = "headUnitSoftwareVersion";
+    /** Where is the driver's seat.  One of the DRIVER_SIDE_* constants */
+    @ValueTypeDef(type = Integer.class)
+    public static final String KEY_DRIVER_POSITION = "driverPosition";
+
+    /** Location of the driver: left */
+    public static final int DRIVER_SIDE_LEFT   = 0;
+    /** Location of the driver: right */
+    public static final int DRIVER_SIDE_RIGHT  = 1;
+    /** Location of the driver: center */
+    public static final int DRIVER_SIDE_CENTER = 2;
+
     /**
-     * Retrieve floating point information for car.
-     * @param key
-     * @return null if the key is not supported.
-     * @throws CarNotConnectedException
-     * @throws IllegalArgumentException
+     * Returns the value for the given key or null if the key is not supported.
      */
     public abstract Float getFloat(String key)
             throws CarNotConnectedException, IllegalArgumentException;
 
+    /**
+     * Returns the value for the given key or null if the key is not supported.
+     */
     public abstract Integer getInt(String key)
             throws CarNotConnectedException, IllegalArgumentException;
 
+    /**
+     * Returns the value for the given key or null if the key is not supported.
+     */
     public abstract Long getLong(String key)
             throws CarNotConnectedException, IllegalArgumentException;
 
+    /**
+     * Returns the value for the given key or null if the key is not supported.
+     */
     public abstract String getString(String key)
             throws CarNotConnectedException, IllegalArgumentException;
 
@@ -78,9 +106,6 @@
      * defined only for the car vendor. Vendor extension can be used for other APIs like
      * getInt / getString, but this is for passing more complex data.
      * @param key
-     * @return
-     * @throws CarNotConnectedException
-     * @throws IllegalArgumentException
      * @hide
      */
     public abstract Bundle getBundle(String key)
diff --git a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
index 7b96ae9..7b5c788 100644
--- a/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
+++ b/car-support-lib/src/android/support/car/CarServiceLoaderEmbedded.java
@@ -79,7 +79,9 @@
 
     @Override
     public int getCarConnectionType() throws CarNotConnectedException {
-        return mCar.getCarConnectionType();
+        @android.support.car.Car.ConnectionType
+        int carConnectionType = mCar.getCarConnectionType();
+        return carConnectionType;
     }
 
     @Override
diff --git a/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java b/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java
index bf51758..5275339 100644
--- a/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java
+++ b/car-support-lib/src/android/support/car/app/menu/compat/EmbeddedCarMenuCallbacksCompat.java
@@ -29,15 +29,13 @@
 import java.util.List;
 import java.util.Map;
 
-import javax.annotation.concurrent.GuardedBy;
-
 public class EmbeddedCarMenuCallbacksCompat extends android.car.app.menu.CarMenuCallbacks {
 
     private final CarMenuCallbacks mCallbacks;
     private final CarDrawerActivity mActivity;
 
     // Map of subscribed ids to their respective callbacks.
-    @GuardedBy("this")
+    // @GuardedBy("this")
     private final Map<String, List<SubscriptionCallbacks>> mSubscriptionMap =
             new HashMap<String, List<SubscriptionCallbacks>>();
 
@@ -178,4 +176,4 @@
                     "before returning!");
         }
     }
-}
\ No newline at end of file
+}
diff --git a/car_product/bootanimations/square_280/bootanimation.zip b/car_product/bootanimations/square_280/bootanimation.zip
new file mode 100644
index 0000000..ab4d79f
--- /dev/null
+++ b/car_product/bootanimations/square_280/bootanimation.zip
Binary files differ
diff --git a/car_product/bootanimations/square_320/bootanimation.zip b/car_product/bootanimations/square_320/bootanimation.zip
new file mode 100644
index 0000000..f621ad8
--- /dev/null
+++ b/car_product/bootanimations/square_320/bootanimation.zip
Binary files differ
diff --git a/car_product/bootanimations/square_360/bootanimation.zip b/car_product/bootanimations/square_360/bootanimation.zip
new file mode 100644
index 0000000..3cb32f4
--- /dev/null
+++ b/car_product/bootanimations/square_360/bootanimation.zip
Binary files differ
diff --git a/car_product/build/car.mk b/car_product/build/car.mk
new file mode 100644
index 0000000..3a7cfb1
--- /dev/null
+++ b/car_product/build/car.mk
@@ -0,0 +1,104 @@
+#
+# Copyright (C) 2016 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.
+#
+
+# Common make file for all car builds
+
+PRODUCT_PACKAGES += \
+    Bluetooth \
+    BluetoothMidiService \
+    bt-map-service \
+    OneTimeInitializer \
+    Provision \
+    SystemUI \
+    SystemUpdater
+
+PRODUCT_PACKAGES += \
+    clatd \
+    clatd.conf \
+    pppd \
+    screenrecord
+
+# This is for testing
+PRODUCT_PACKAGES +=
+    EmbeddedKitchenSinkApp
+
+PRODUCT_COPY_FILES := \
+    frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf \
+    packages/services/Car/car_product/preloaded-classes-car:system/etc/preloaded-classes \
+
+PRODUCT_PROPERTY_OVERRIDES += \
+    ro.carrier=unknown
+
+# Overlay for Google network and fused location providers
+$(call inherit-product, device/sample/products/location_overlay.mk)
+$(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/dancing-script/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/carrois-gothic-sc/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/coming-soon/fonts.mk)
+$(call inherit-product-if-exists, external/google-fonts/cutive-mono/fonts.mk)
+$(call inherit-product-if-exists, external/noto-fonts/fonts.mk)
+$(call inherit-product-if-exists, external/naver-fonts/fonts.mk)
+$(call inherit-product-if-exists, external/roboto-fonts/fonts.mk)
+$(call inherit-product-if-exists, external/hyphenation-patterns/patterns.mk)
+$(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk)
+$(call inherit-product-if-exists, frameworks/webview/chromium/chromium.mk)
+$(call inherit-product, packages/services/Car/car_product/build/car_base.mk)
+
+# Overrides
+PRODUCT_BRAND := generic
+PRODUCT_DEVICE := generic
+PRODUCT_NAME := generic_car_no_telephony
+
+PRODUCT_PROPERTY_OVERRIDES := \
+    ro.config.ringtone=Girtab.ogg \
+    ro.config.notification_sound=Tethys.ogg \
+    ro.config.alarm_alert=Oxygen.ogg \
+    $(PRODUCT_PROPERTY_OVERRIDES) \
+
+# SetupWizard requires internet access before continuing
+# (hot sim or wifi not blocked by captive portal)
+PRODUCT_PROPERTY_OVERRIDES += \
+    ro.setupwizard.require_network=any
+
+
+PRODUCT_PROPERTY_OVERRIDES += \
+    keyguard.no_require_sim=true
+
+# Automotive specific packages
+PRODUCT_PACKAGES += \
+    vehicle_network_service \
+    CarService \
+    CarUiProvider \
+    android.car \
+    libvehiclenetwork-native \
+    vns_policy.xml
+
+# Boot animation
+PRODUCT_COPY_FILES += \
+    packages/services/Car/car_product/bootanimations/square_280/bootanimation.zip:system/media/bootanimation.zip
+
+PRODUCT_PROPERTY_OVERRIDES += \
+    fmas.spkr_6ch=35,20,110 \
+    fmas.spkr_2ch=35,25 \
+    fmas.spkr_angles=10 \
+    fmas.spkr_sgain=0 \
+    media.aac_51_output_enabled=true
+
+PRODUCT_LOCALES := en_US af_ZA am_ET ar_EG bg_BG bn_BD ca_ES cs_CZ da_DK de_DE el_GR en_AU en_GB en_IN es_ES es_US et_EE eu_ES fa_IR fi_FI fr_CA fr_FR gl_ES hi_IN hr_HR hu_HU hy_AM in_ID is_IS it_IT iw_IL ja_JP ka_GE km_KH ko_KR ky_KG lo_LA lt_LT lv_LV km_MH kn_IN mn_MN ml_IN mk_MK mr_IN ms_MY my_MM ne_NP nb_NO nl_NL pl_PL pt_BR pt_PT ro_RO ru_RU si_LK sk_SK sl_SI sr_RS sv_SE sw_TZ ta_IN te_IN th_TH tl_PH tr_TR uk_UA vi_VN zh_CN zh_HK zh_TW zu_ZA en_XA ar_XB
+
+PRODUCT_BOOT_JARS += \
+    android.car
+
diff --git a/car_product/build/car_base.mk b/car_product/build/car_base.mk
new file mode 100644
index 0000000..590a7e7
--- /dev/null
+++ b/car_product/build/car_base.mk
@@ -0,0 +1,87 @@
+#
+# Copyright (C) 2016 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.
+#
+
+# Base platform for car builds
+# car packages should be added to car.mk instead of here
+
+PRODUCT_PACKAGE_OVERLAYS := packages/services/Car/car_product/overlay
+
+PRODUCT_PACKAGES += \
+    ContactsProvider \
+    DefaultContainerService \
+    Home \
+    BasicDreams \
+    CaptivePortalLogin \
+    CertInstaller \
+    DeskClock \
+    DocumentsUI \
+    DownloadProviderUi \
+    FusedLocation \
+    InputDevices \
+    KeyChain \
+    Keyguard \
+    LatinIME \
+    Launcher2 \
+    ManagedProvisioning \
+    PicoTts \
+    PacProcessor \
+    libpac \
+    PrintSpooler \
+    ProxyHandler \
+    Settings \
+    SharedStorageBackup \
+    VpnDialogs \
+    MmsService \
+    ExternalStorageProvider \
+    atrace \
+    libandroidfw \
+    libaudiopreprocessing \
+    libaudioutils \
+    libfilterpack_imageproc \
+    libgabi++ \
+    libmdnssd \
+    libnfc_ndef \
+    libpowermanager \
+    libspeexresampler \
+    libstagefright_soft_aacdec \
+    libstagefright_soft_aacenc \
+    libstagefright_soft_amrdec \
+    libstagefright_soft_amrnbenc \
+    libstagefright_soft_amrwbenc \
+    libstagefright_soft_avcdec \
+    libstagefright_soft_avcenc \
+    libstagefright_soft_flacenc \
+    libstagefright_soft_g711dec \
+    libstagefright_soft_gsmdec \
+    libstagefright_soft_hevcdec \
+    libstagefright_soft_mp3dec \
+    libstagefright_soft_mpeg2dec \
+    libstagefright_soft_mpeg4dec \
+    libstagefright_soft_mpeg4enc \
+    libstagefright_soft_opusdec \
+    libstagefright_soft_rawdec \
+    libstagefright_soft_vorbisdec \
+    libstagefright_soft_vpxdec \
+    libstagefright_soft_vpxenc \
+    libvariablespeed \
+    libwebrtc_audio_preprocessing \
+    mdnsd \
+    requestsync \
+    wifi-service \
+    A2dpSinkService
+
+$(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk)
+
diff --git a/car_product/init/init.car.rc b/car_product/init/init.car.rc
new file mode 100644
index 0000000..220ca48
--- /dev/null
+++ b/car_product/init/init.car.rc
@@ -0,0 +1,9 @@
+
+service vns /system/bin/vehicle_network_service
+   class core
+   user system
+   group system
+   critical
+
+on boot
+    start vns
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png b/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
new file mode 100644
index 0000000..22441ae
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png b/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
new file mode 100644
index 0000000..cc651de
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png b/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
new file mode 100644
index 0000000..03b93aa
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
Binary files differ
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/config.xml b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
new file mode 100644
index 0000000..141550b
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/config.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2015, 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.
+*/
+-->
+
+<!-- These resources are around just to allow their values to be customized
+     for different hardware and product builds.  Do not translate. -->
+<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+    <!-- Enable multi-user. -->
+    <bool name="config_enableMultiUserUI">true</bool>
+    <!-- Arbitrary max 8 users. -->
+    <integer name="config_multiuserMaximumUsers">8</integer>
+    <!-- Car Mode -->
+    <integer name="config_defaultUiModeType">3</integer>
+    <!-- Can't leave car mode -->
+    <bool name="config_lockUiMode">true</bool>
+    <!--  Control whether to launch Car dock home app when user presses home button or when
+          car dock intent is fired.
+          In mobile device, usually separate home app is expected in car mode, and this should be
+          enabled. But in environments like real car, default home app may be enough, and in that
+          case, this can be disabled (set to false). -->
+    <bool name="config_enableCarDockHomeLaunch">false</bool>
+    <!--  Control whether to lock day/night mode change from normal application. When it is
+          true, day / night mode change is only allowed to apps with MODIFY_DAY_NIGHT_MODE
+          permission. -->
+    <bool name="config_lockDayNightMode">true</bool>
+    <!-- Allow smart unlock immediately after boot because the user shouldn't have to enter a pin
+         code to unlock their car head unit. -->
+    <bool name="config_strongAuthRequiredOnBoot">false</bool>
+
+    <integer name="config_jobSchedulerInactivityIdleThreshold">0</integer>
+    <integer name="config_jobSchedulerIdleWindowSlop">0</integer>
+</resources>
diff --git a/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml b/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
new file mode 100644
index 0000000..1db7bae
--- /dev/null
+++ b/car_product/overlay/frameworks/base/core/res/res/values/dimens.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="status_bar_height">96dp</dimen>
+    <!-- Don't this we need this one since we're always in landscape-->
+    <dimen name="navigation_bar_height">80dp</dimen>
+    <dimen name="navigation_bar_height_landscape">80dp</dimen>
+    <dimen name="status_bar_icon_size">40dp</dimen>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml
new file mode 100644
index 0000000..74f1691
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_car.xml
@@ -0,0 +1,34 @@
+<!--
+    Copyright (C) 2016 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="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48">
+
+    <path
+        android:pathData="M-838-1336H562v3600H-838z" />
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M28.7 12.1c-1-.4-2.2 .1 -2.6 1.1L23.4 20c-1.9 .3 -3.4 2-3.4 4 0 2.2 1.8 4 4
+4s4-1.8 4-4c0-.9-.3-1.8-.9-2.5l2.7-6.8c.5-1 0-2.1-1.1-2.6zM14 18c-1.1 0-2 .9-2
+2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm8-4c0-1.1-.9-2-2-2s-2 .9-2 2 .9 2 2 2 2-.9 2-2zm12
+4c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zM24 4C13 4 4 13 4 24s9 20 20 20
+20-9 20-20S35 4 24 4zm10.5 32c-2.8-2.5-6.5-4-10.5-4s-7.7 1.5-10.5 4C10.1 33.1 8
+28.8 8 24c0-8.8 7.2-16 16-16s16 7.2 16 16c0 4.8-2.1 9.1-5.5 12z" />
+    <path
+        android:pathData="M0 0h48v48H0z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml
new file mode 100644
index 0000000..e52ea9a
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_music.xml
@@ -0,0 +1,30 @@
+<!--
+    Copyright (C) 2016 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="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48">
+
+    <path
+        android:fillAlpha=".1"
+        android:strokeAlpha=".1"
+        android:pathData="M0 0h48v48H0z" />
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M24 2C14.06 2 6 10.06 6 20v14c0 3.31 2.69 6 6 6h6V24h-8v-4c0-7.73 6.27-14
+14-14s14 6.27 14 14v4h-8v16h6c3.31 0 6-2.69 6-6V20c0-9.94-8.06-18-18-18z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml
new file mode 100644
index 0000000..2638fdd
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_navigation.xml
@@ -0,0 +1,28 @@
+<!--
+    Copyright (C) 2016 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="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48">
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M43.41 22.59l-18-18c-.78-.78-2.05-.78-2.82 0l-18 18c-.78 .78 -.78 2.05 0 2.83l18
+17.99v.01c.78 .78 2.05 .78 2.83 0l18-18c.78-.79 .78 -2.05-.01-2.83zM28
+29v-5h-8v6h-4v-8c0-1.11 .89 -2 2-2h10v-5l7 7-7 7z" />
+    <path
+        android:pathData="M0 0h48v48H0z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml
new file mode 100644
index 0000000..e7d5de4
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_overview.xml
@@ -0,0 +1,28 @@
+<!--
+    Copyright (C) 2016 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="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48">
+
+    <path
+        android:pathData="M0 0h48v48H0z" />
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M24 4C12.95 4 4 12.95 4 24s8.95 20 20 20 20-8.95 20-20S35.05 4 24 4zm0 36c-8.82
+0-16-7.18-16-16S15.18 8 24 8s16 7.18 16 16-7.18 16-16 16z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml
new file mode 100644
index 0000000..d063797
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/drawable/car_ic_phone.xml
@@ -0,0 +1,30 @@
+<!--
+    Copyright (C) 2016 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="48dp"
+    android:height="48dp"
+    android:viewportWidth="48"
+    android:viewportHeight="48">
+
+    <path
+        android:pathData="M0 0h48v48H0z" />
+    <path
+        android:fillColor="#FFFFFFFF"
+        android:pathData="M13.25 21.59c2.88 5.66 7.51 10.29 13.18 13.17l4.4-4.41c.55-.55 1.34-.71
+2.03-.49C35.1 30.6 37.51 31 40 31c1.11 0 2 .89 2 2v7c0 1.11-.89 2-2 2C21.22 42 6
+26.78 6 8c0-1.11 .9 -2 2-2h7c1.11 0 2 .89 2 2 0 2.49 .4 4.9 1.14 7.14 .22 .69
+.06 1.48-.49 2.03l-4.4 4.42z" />
+</vector>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml
new file mode 100644
index 0000000..f82c8a9
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values-sw720dp/dimens.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- gap on either side of status bar notification icons -->
+    <dimen name="status_bar_icon_padding">8dp</dimen>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml
new file mode 100644
index 0000000..5227844
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/arrays_car.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2016, 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.
+*/
+-->
+
+<resources>
+    <!-- There needs to be correspondence per index between these arrays, which means that if there
+         isn't a longpress action associated with a shortcut item, put in an empty item to make
+         sure everything lines up.
+    -->
+    <array name="car_facet_icons">
+        <item>@drawable/car_ic_navigation</item>
+        <item>@drawable/car_ic_phone</item>
+        <item>@drawable/car_ic_overview</item>
+        <item>@drawable/car_ic_music</item>
+        <item>@drawable/car_ic_car</item>
+    </array>
+    <array name="car_facet_intent_uris">
+        <!-- Launch the lenspicker for all the facets. The lens picker will trampoline into the last run app or display a list of valid apps -->
+        <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+        <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+        <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.HOME;launchFlags=0x14000000;package=com.google.android.car.launcher;end</item>
+        <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+        <item>intent:#Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x14000000;package=com.android.support.car.lenspicker;end</item>
+    </array>
+    <array name="car_facet_longpress_intent_uris">
+        <item></item>
+        <item></item>
+        <item></item>
+        <item></item>
+        <!-- Long pressing the overflow triggers a bug report -->
+        <item>intent:#Intent;component=com.google.android.car.bugreport/.BugReportActivity;end</item>
+    </array>
+    <array name="car_facet_category_filters">
+        <item>android.intent.category.APP_MAPS</item>
+        <item>android.intent.category.APP_MESSAGING</item>
+        <item></item>
+        <item>android.intent.category.APP_MUSIC</item>
+        <item></item>
+    </array>
+    <array name="car_facet_package_filters">
+        <item>com.google.android.apps.maps</item>
+        <item>com.google.android.car.dialer</item>
+        <item></item>
+        <item></item>
+        <item>com.google.android.car.hvac;com.android.settings;com.android.vending;com.google.android.car.bugreport;com.google.android.car.kitchensink;com.google.android.car.systemupdater;org.chromium.webview_shell;com.android.contacts;org.codeaurora.bluetooth.bttestapp;com.google.android.projection.sink;com.google.android.auto.mapclient</item>
+    </array>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
new file mode 100644
index 0000000..ac534b2
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/config.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2016, 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.
+*/
+-->
+
+<!-- Resource overrides for car system ui. -->
+<resources>
+    <string name="config_statusBarComponent" translatable="false">com.android.systemui.statusbar.car.CarStatusBar</string>
+    <bool name="config_enableFullscreenUserSwitcher">true</bool>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
new file mode 100644
index 0000000..94deae9
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/dimens.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!-- The amount by which to scale up the status bar icons. -->
+    <item name="status_bar_icon_scale_factor" format="float" type="dimen">2.3</item>
+
+    <!-- The font size for the clock in the status bar. -->
+    <dimen name="status_bar_clock_size">44sp</dimen>
+
+    <!-- The starting padding for the clock in the status bar. -->
+    <dimen name="status_bar_clock_starting_padding">24dp</dimen>
+
+    <!-- The end padding for the clock in the status bar. -->
+    <dimen name="status_bar_clock_end_padding">@dimen/status_bar_clock_starting_padding</dimen>
+
+    <!-- size at which Notification icons will be drawn in the status bar -->
+    <dimen name="status_bar_icon_drawing_size">32dp</dimen>
+
+    <!-- Starting margin before the signal cluster -->
+    <dimen name="signal_cluster_margin_start">8dp</dimen>
+
+    <!-- Padding between signal cluster and battery icon -->
+    <dimen name="signal_cluster_battery_padding">@dimen/status_bar_clock_starting_padding</dimen>
+
+    <!-- Spacing after the wifi signals that is present if there are any icons following it. -->
+    <dimen name="status_bar_wifi_signal_spacer_width">@dimen/status_bar_clock_starting_padding</dimen>
+
+    <!-- Spacing before the airplane mode icon if there are any icons preceding it. -->
+    <dimen name="status_bar_airplane_spacer_width">@dimen/status_bar_clock_starting_padding</dimen>
+
+    <!-- Padding at the end of the view that displays the mobile signal icons. This value should
+         be double the signal_cluster_margin_start. -->
+    <dimen name="mobile_signal_group_end_padding">16dp</dimen>
+
+    <!-- Padding between the mobile data type and the strength indicator. -->
+    <dimen name="mobile_data_icon_start_padding">@dimen/mobile_signal_group_end_padding</dimen>
+
+    <!-- gap on either side of status bar notification icons -->
+    <dimen name="status_bar_icon_padding">8dp</dimen>
+
+    <!-- Standard image button size for volume dialog buttons -->
+    <dimen name="volume_button_size">84dp</dimen>
+
+    <!-- The maximum width allowed for the volume dialog. For auto, we allow this to span a good
+         deal of the screen. This value accounts for the side margins. -->
+    <dimen name="volume_dialog_panel_width">1920dp</dimen>
+</resources>
diff --git a/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml
new file mode 100644
index 0000000..697e195
--- /dev/null
+++ b/car_product/overlay/frameworks/base/packages/SystemUI/res/values/styles.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <!-- The style for the volume icons in the volume dialog. This style makes the icon scale to
+         fit its container since auto wants the icon to be larger. The padding is added to make it
+         so the icon does not press along the edges of the dialog. -->
+    <style name="VolumeButtons" parent="@android:style/Widget.Material.Button.Borderless">
+        <item name="android:background">@drawable/btn_borderless_rect</item>
+        <item name="android:scaleType">fitCenter</item>
+        <item name="android:padding">22dp</item>
+    </style>
+
+</resources>
diff --git a/car_product/overlay/frameworks/packages/SettingsProvider/res/values/default.xml b/car_product/overlay/frameworks/packages/SettingsProvider/res/values/default.xml
new file mode 100644
index 0000000..0eaed7d
--- /dev/null
+++ b/car_product/overlay/frameworks/packages/SettingsProvider/res/values/default.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/**
+ * Copyright (c) 2015, 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.
+ */
+-->
+<resources>
+    <!-- no setup wizard - we are already "provisioned" - This will go soon! -->
+    <bool name="def_device_provisioned">true</bool>
+    <integer name="add_users_when_locked">1</integer>
+</resources>
diff --git a/car_product/overlay/packages/services/Telecomm/res/values/config.xml b/car_product/overlay/packages/services/Telecomm/res/values/config.xml
new file mode 100644
index 0000000..58dc706
--- /dev/null
+++ b/car_product/overlay/packages/services/Telecomm/res/values/config.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+
+<!-- Telecomm resources that may need to be customized for different hardware or product
+    builds. -->
+<resources>
+    <!-- Determines if the current device should allow emergency numbers to be logged in the
+         call log. Some carriers require that emergency calls *not* be logged, presumably to
+         avoid the risk of accidental redialing from the call log UI.
+         The default is false. -->
+    <bool name="allow_emergency_numbers_in_call_log">false</bool>
+
+    <!-- Determine whether we want to play local DTMF tones in a call, or just let the radio/BP
+         handle playing of the tones. -->
+    <bool name="allow_local_dtmf_tones">true</bool>
+
+    <!-- Package name for the default in-call UI and dialer [DO NOT TRANSLATE] -->
+    <string name="ui_default_package" translatable="false">com.google.android.car.dialer</string>
+
+    <!-- Class name for the default in-call UI Service [DO NOT TRANSLATE] -->
+    <string name="incall_default_class" translatable="false">com.google.android.car.dialer.telecom.embedded.InCallServiceImpl</string>
+
+    <!-- Class name for the default main dialer activity [DO NOT TRANSLATE] -->
+    <string name="dialer_default_class" translatable="false">com.google.android.car.dialer.TelecomActivity</string>
+
+    <!-- Flag indicating if the tty is enabled -->
+    <bool name="tty_enabled">false</bool>
+</resources>
diff --git a/car_product/preloaded-classes-car b/car_product/preloaded-classes-car
new file mode 100644
index 0000000..962099f
--- /dev/null
+++ b/car_product/preloaded-classes-car
@@ -0,0 +1 @@
+# Classes which are preloaded by com.android.internal.os.ZygoteInit.
diff --git a/car_product/sepolicy/atfwd.te b/car_product/sepolicy/atfwd.te
new file mode 100644
index 0000000..f9c5eb1
--- /dev/null
+++ b/car_product/sepolicy/atfwd.te
@@ -0,0 +1,14 @@
+type atfwd, domain;
+type atfwd_exec, exec_type, file_type;
+
+init_daemon_domain(atfwd)
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(atfwd)
+
+# Set radio.atfwd.* properties.
+set_prop(atfwd, radio_atfwd_prop)
+
+userdebug_or_eng(`
+    allow atfwd diag_device:chr_file rw_file_perms;
+')
diff --git a/car_product/sepolicy/bluetooth.te b/car_product/sepolicy/bluetooth.te
new file mode 100644
index 0000000..f93e040
--- /dev/null
+++ b/car_product/sepolicy/bluetooth.te
@@ -0,0 +1,18 @@
+# Allow access to wc_transport.* properties.
+set_prop(bluetooth, wc_transport_prop)
+
+# Allow access to /dev/ttyHS0
+allow bluetooth serial_device:chr_file rw_file_perms;
+
+# Connect to start_hci_filter service.
+allow bluetooth start_hci_filter:unix_stream_socket connectto;
+
+# Allow access to /persist/.bt_nv.bin.
+allow bluetooth persist_file:file rw_file_perms;
+
+# Allow access to /bt_firmware files.
+allow bluetooth bt_firmware_file:file r_file_perms;
+
+# Allow access to bt_power sysfs nodes.
+r_dir_file(bluetooth, sysfs_bt_power);
+allow bluetooth sysfs_bt_power:file w_file_perms;
diff --git a/car_product/sepolicy/can.te b/car_product/sepolicy/can.te
new file mode 100644
index 0000000..e18b839
--- /dev/null
+++ b/car_product/sepolicy/can.te
@@ -0,0 +1,18 @@
+# CAN service
+type can, domain;
+type can_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(can)
+
+allow can self:capability net_admin;
+
+allow can self:netlink_route_socket nlmsg_write;
+
+allow can shell_exec:file r_file_perms;
+
+# Allow execution of /system/bin/ip.
+allow can system_file:file rx_file_perms;
+
+# Allow can operations
+allow can self:capability { net_raw };
diff --git a/car_product/sepolicy/config_bluetooth.te b/car_product/sepolicy/config_bluetooth.te
new file mode 100644
index 0000000..f0c8789
--- /dev/null
+++ b/car_product/sepolicy/config_bluetooth.te
@@ -0,0 +1,22 @@
+# config_bluetooth service
+type config_bluetooth, domain;
+type config_bluetooth_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(config_bluetooth)
+
+# Set bluetooth.* and qualcomm.bluetooth.* properties.
+set_prop(config_bluetooth, bluetooth_prop);
+
+# Allow execution of /system/bin/btnvtool.
+allow config_bluetooth btnvtool_exec:file rx_file_perms;
+
+# Allow access to /persist/.bt_nv.bin.
+allow config_bluetooth persist_file:dir w_dir_perms;
+allow config_bluetooth persist_file:file create_file_perms;
+
+allow config_bluetooth shell_exec:file r_file_perms;
+
+allow config_bluetooth toolbox_exec:file rx_file_perms;
+
+allow config_bluetooth sysfs:file r_file_perms;
diff --git a/car_product/sepolicy/device.te b/car_product/sepolicy/device.te
new file mode 100644
index 0000000..38d2618
--- /dev/null
+++ b/car_product/sepolicy/device.te
@@ -0,0 +1,14 @@
+# Define the logging device type
+type diag_device, dev_type, mlstrustedobject;
+
+#device type for gss device nodes, ie /dev/gss
+type gss_device, dev_type;
+
+type hsic_device, dev_type;
+type latency_device, dev_type;
+type modem_block_device, dev_type;
+type persist_block_device, dev_type;
+type qmuxd_socket, dev_type;
+type smem_log_device, dev_type;
+type ssd_block_device, dev_type;
+type wcnss_device, dev_type;
diff --git a/car_product/sepolicy/domain.te b/car_product/sepolicy/domain.te
new file mode 100644
index 0000000..67cbce6
--- /dev/null
+++ b/car_product/sepolicy/domain.te
@@ -0,0 +1,48 @@
+# Ignore personality-8 denials.
+dontaudit adbd kernel:system module_request;
+dontaudit atfwd kernel:system module_request;
+dontaudit bootanim kernel:system module_request;
+dontaudit can kernel:system module_request;
+dontaudit config_bluetooth kernel:system module_request;
+dontaudit debuggerd kernel:system module_request;
+dontaudit drmserver kernel:system module_request;
+dontaudit fsck kernel:system module_request;
+dontaudit gatekeeperd kernel:system module_request;
+dontaudit healthd kernel:system module_request;
+dontaudit init kernel:system module_request;
+dontaudit installd kernel:system module_request;
+dontaudit irsc_util kernel:system module_request;
+dontaudit keystore kernel:system module_request;
+dontaudit lmkd kernel:system module_request;
+dontaudit logd kernel:system module_request;
+dontaudit mm-pp-daemon kernel:system module_request;
+dontaudit modem-sh kernel:system module_request;
+dontaudit mpdecision kernel:system module_request;
+dontaudit netd kernel:system module_request;
+dontaudit netmgrd kernel:system module_request;
+dontaudit qcom-c_core-sh kernel:system module_request;
+dontaudit qcom-c_main-sh kernel:system module_request;
+dontaudit qcom-post-boot kernel:system module_request;
+dontaudit qcom-sh kernel:system module_request;
+dontaudit qcom-usb-sh kernel:system module_request;
+dontaudit qmuxd kernel:system module_request;
+dontaudit rmt_storage kernel:system module_request;
+dontaudit sdcardd kernel:system module_request;
+dontaudit servicemanager kernel:system module_request;
+dontaudit shell kernel:system module_request;
+dontaudit start_hci_filter kernel:system module_request;
+dontaudit surfaceflinger kernel:system module_request;
+dontaudit thermal-engine kernel:system module_request;
+dontaudit time_daemon kernel:system module_request;
+dontaudit tzdatacheck kernel:system module_request;
+dontaudit ueventd kernel:system module_request;
+dontaudit untrusted_app kernel:system module_request;
+dontaudit usf-post-boot kernel:system module_request;
+dontaudit vns kernel:system module_request;
+dontaudit vold kernel:system module_request;
+dontaudit wcnss_service kernel:system module_request;
+dontaudit zygote kernel:system module_request;
+
+userdebug_or_eng(`
+    dontaudit perfprofd kernel:system module_request;
+')
diff --git a/car_product/sepolicy/file.te b/car_product/sepolicy/file.te
new file mode 100644
index 0000000..2aaa844
--- /dev/null
+++ b/car_product/sepolicy/file.te
@@ -0,0 +1,21 @@
+type btnvtool_exec, exec_type, file_type;
+
+# Bluetooth firmware file types
+type bt_firmware_file, contextmount_type, fs_type;
+
+# Default type for anything under /firmware.
+type firmware_file, contextmount_type, fs_type;
+
+type mpdecision_socket, file_type;
+type perfd_data_file, file_type, data_file_type;
+type persist_file, file_type;
+type pps_socket, file_type;
+type sysfs_bt_power, sysfs_type, fs_type;
+type sysfs_dcvs, sysfs_type, fs_type;
+type sysfs_hsic_modem_wait, sysfs_type, fs_type;
+type sysfs_mpdecision, sysfs_type, fs_type;
+type sysfs_rpm_resources, sysfs_type, fs_type;
+type sysfs_smd_open_timeout, sysfs_type, fs_type;
+type sysfs_usb, sysfs_type, fs_type;
+type thermal_socket, file_type;
+type time_data_file, file_type, data_file_type;
diff --git a/car_product/sepolicy/file_contexts b/car_product/sepolicy/file_contexts
new file mode 100644
index 0000000..55b3276
--- /dev/null
+++ b/car_product/sepolicy/file_contexts
@@ -0,0 +1,97 @@
+###################################
+# Data files
+#
+/data/misc/perfd(/.*)?                           u:object_r:perfd_data_file:s0
+/data/system/perfd(/.*)?                         u:object_r:perfd_data_file:s0
+/data/time(/.*)?                                 u:object_r:time_data_file:s0
+
+###################################
+# Dev nodes
+#
+/dev/cpu_dma_latency                             u:object_r:latency_device:s0
+/dev/diag                                        u:object_r:diag_device:s0
+/dev/kgsl-3d0                                    u:object_r:gpu_device:s0
+/dev/gss                                         u:object_r:gss_device:s0
+/dev/hsicctl[0-3]                                u:object_r:hsic_device:s0
+/dev/mdp_arb                                     u:object_r:graphics_device:s0
+/dev/media([0-9])+                               u:object_r:video_device:s0
+/dev/msm_acdb                                    u:object_r:audio_device:s0
+/dev/msm_camera(/.*)?                            u:object_r:video_device:s0
+/dev/msm_rotator                                 u:object_r:video_device:s0
+/dev/msm_vidc_.*                                 u:object_r:video_device:s0
+/dev/smem_log                                    u:object_r:smem_log_device:s0
+/dev/socket/mpdecision                           u:object_r:mpdecision_socket:s0
+/dev/socket/pps                                  u:object_r:pps_socket:s0
+/dev/socket/thermal-recv-client                  u:object_r:thermal_socket:s0
+/dev/socket/thermal-send-client                  u:object_r:thermal_socket:s0
+/dev/socket/qmux_radio(/.*)?                     u:object_r:qmuxd_socket:s0
+/dev/ttyHS[0-9]*                                 u:object_r:serial_device:s0
+/dev/v4l-subdev.*                                u:object_r:video_device:s0
+/dev/wcnss_ctrl                                  u:object_r:wcnss_device:s0
+/dev/wcnss_wlan                                  u:object_r:wcnss_device:s0
+
+###################################
+# Dev block nodes
+#
+/dev/block/platform/msm_sdcc\.1/by-name/boot     u:object_r:boot_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/cache    u:object_r:cache_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/fsg      u:object_r:modem_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/modemst1 u:object_r:modem_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/modemst2 u:object_r:modem_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/persist  u:object_r:persist_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/recovery u:object_r:recovery_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/ssd      u:object_r:ssd_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/system   u:object_r:system_block_device:s0
+/dev/block/platform/msm_sdcc\.1/by-name/userdata u:object_r:userdata_block_device:s0
+/dev/block/mmcblk0                               u:object_r:root_block_device:s0
+
+###################################
+# Persist files
+#
+/persist(/.*)?                                   u:object_r:persist_file:s0
+
+###################################
+# System files
+#
+/system/bin/ATFWD-daemon                         u:object_r:atfwd_exec:s0
+/system/bin/btnvtool                             u:object_r:btnvtool_exec:s0
+/system/bin/init\.class_main\.sh                 u:object_r:qcom-c_main-sh_exec:s0
+/system/bin/init\.qcom\.sh                       u:object_r:qcom-sh_exec:s0
+/system/bin/init\.qcom\.bt\.sh                   u:object_r:config_bluetooth_exec:s0
+/system/bin/init\.qcom\.class_core\.sh           u:object_r:qcom-c_core-sh_exec:s0
+/system/bin/init\.qcom\.modem_links\.sh          u:object_r:modem-sh_exec:s0
+/system/bin/init\.qcom\.post_boot\.sh            u:object_r:qcom-post-boot_exec:s0
+/system/bin/init\.qcom\.usb\.sh                  u:object_r:qcom-usb-sh_exec:s0
+/system/bin/init\.qti\.can\.sh                   u:object_r:can_exec:s0
+/system/bin/usf_post_boot\.sh                    u:object_r:usf-post-boot_exec:s0
+/system/bin/irsc_util                            u:object_r:irsc_util_exec:s0
+/system/bin/mm-pp-daemon                         u:object_r:mm-pp-daemon_exec:s0
+/system/bin/mpdecision                           u:object_r:mpdecision_exec:s0
+/system/bin/netmgrd                              u:object_r:netmgrd_exec:s0
+/system/bin/qmuxd                                u:object_r:qmuxd_exec:s0
+/system/bin/rmt_storage                          u:object_r:rmt_storage_exec:s0
+/system/bin/thermal-engine                       u:object_r:thermal-engine_exec:s0
+/system/bin/time_daemon                          u:object_r:time_daemon_exec:s0
+/system/bin/vehicle_network_service              u:object_r:vns_exec:s0
+/system/bin/wcnss_filter                         u:object_r:start_hci_filter_exec:s0
+/system/bin/wcnss_service                        u:object_r:wcnss_service_exec:s0
+/system/bin/wpa_cli                              u:object_r:wcnss_service_exec:s0
+
+###################################
+# sysfs files
+#
+/sys/class/thermal(/.*)?                                u:object_r:sysfs_thermal:s0
+/sys/class/android_usb(/.*)?                            u:object_r:sysfs_usb:s0
+/sys/devices/virtual/thermal(/.*)?                      u:object_r:sysfs_thermal:s0
+/sys/module/msm_dcvs(/.*)?                              u:object_r:sysfs_dcvs:s0
+/sys/module/msm_mpdecision(/.*)?                        u:object_r:sysfs_mpdecision:s0
+/sys/module/msm_thermal(/.*)?                           u:object_r:sysfs_thermal:s0
+/sys/module/pm_8x60(/.*)?                               u:object_r:sysfs_devices_system_cpu:s0
+/sys/module/rmnet_usb(/.*)?                             u:object_r:sysfs_usb:s0
+/sys/module/rpm_resources(/.*)?                         u:object_r:sysfs_rpm_resources:s0
+/sys/module/spm_v2(/.*)?                                u:object_r:sysfs_thermal:s0
+/sys/devices/platform/bt_power(/.*)?                    u:object_r:sysfs_bt_power:s0
+/sys/devices/platform/msm_hsusb\.[1-4](/.*)?            u:object_r:sysfs_usb:s0
+/sys/devices/virtual/android_usb(/.*)?                  u:object_r:sysfs_usb:s0
+/sys/devices/virtual/hsicctl/hsicctl[0-9]+/modem_wait   u:object_r:sysfs_hsic_modem_wait:s0
+/sys/devices/virtual/smdpkt/smdcntl[0-9]+/open_timeout  u:object_r:sysfs_smd_open_timeout:s0
diff --git a/car_product/sepolicy/init.te b/car_product/sepolicy/init.te
new file mode 100644
index 0000000..c909543
--- /dev/null
+++ b/car_product/sepolicy/init.te
@@ -0,0 +1,4 @@
+# Allow legacy sdcard for creating directory symlinks
+allow init tmpfs:lnk_file create_file_perms;
+
+r_dir_file(init, sysfs_usb);
diff --git a/car_product/sepolicy/irsc_util.te b/car_product/sepolicy/irsc_util.te
new file mode 100644
index 0000000..148134e
--- /dev/null
+++ b/car_product/sepolicy/irsc_util.te
@@ -0,0 +1,6 @@
+type irsc_util, domain;
+type irsc_util_exec, exec_type, file_type;
+
+init_daemon_domain(irsc_util)
+
+allow irsc_util self:socket create_socket_perms;
diff --git a/car_product/sepolicy/mm-pp-daemon.te b/car_product/sepolicy/mm-pp-daemon.te
new file mode 100644
index 0000000..c463509
--- /dev/null
+++ b/car_product/sepolicy/mm-pp-daemon.te
@@ -0,0 +1,13 @@
+type mm-pp-daemon, domain;
+type mm-pp-daemon_exec, exec_type, file_type;
+
+init_daemon_domain(mm-pp-daemon)
+
+# Need to use fb ioctls to communicate with kernel
+allow mm-pp-daemon graphics_device:chr_file rw_file_perms;
+
+# Allow socket calls in mm-pp-daemon
+allow mm-pp-daemon pps_socket:sock_file rw_file_perms;
+
+# Set hw.cabl.* properties.
+set_prop(mm-pp-daemon, hw_cabl_prop)
diff --git a/car_product/sepolicy/modem-sh.te b/car_product/sepolicy/modem-sh.te
new file mode 100644
index 0000000..0a06dc9
--- /dev/null
+++ b/car_product/sepolicy/modem-sh.te
@@ -0,0 +1,8 @@
+# modem-sh service
+type modem-sh, domain;
+type modem-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(modem-sh)
+
+allow modem-sh shell_exec:file r_file_perms;
diff --git a/car_product/sepolicy/mpdecision.te b/car_product/sepolicy/mpdecision.te
new file mode 100644
index 0000000..432f4ee
--- /dev/null
+++ b/car_product/sepolicy/mpdecision.te
@@ -0,0 +1,36 @@
+# MpDecision service
+type mpdecision, domain;
+type mpdecision_exec, exec_type, file_type;
+
+init_daemon_domain(mpdecision)
+
+allow mpdecision self:capability { net_admin fsetid };
+
+allow mpdecision self:netlink_kobject_uevent_socket create_socket_perms;
+
+# Access to /dev/cpu_dma_latency.
+allow mpdecision latency_device:chr_file w_file_perms;
+
+# Create and access to /dev/socket/mpdecision
+allow mpdecision mpdecision_socket:sock_file rw_file_perms;
+
+# Access to /sys/devices/system/cpu/*.
+allow mpdecision sysfs_devices_system_cpu:file rw_file_perms;
+
+# Access to sysfs_thermal nodes.
+allow mpdecision sysfs_thermal:dir r_dir_perms;
+allow mpdecision sysfs_thermal:file r_file_perms;
+
+# Access to mpctl data files and sockets.
+allow mpdecision perfd_data_file:dir w_dir_perms;
+allow mpdecision perfd_data_file:file create_file_perms;
+allow mpdecision perfd_data_file:sock_file create_file_perms;
+
+# Access to some dynamically generated files under /sys/devices/system/cpu/.
+allow mpdecision sysfs:file write;
+
+allow mpdecision self:capability dac_override;
+
+allow mpdecision sysfs:file r_file_perms;
+
+allow mpdecision proc:file rw_file_perms;
diff --git a/car_product/sepolicy/netd.te b/car_product/sepolicy/netd.te
new file mode 100644
index 0000000..2b002ec
--- /dev/null
+++ b/car_product/sepolicy/netd.te
@@ -0,0 +1 @@
+dontaudit netd self:capability sys_module;
diff --git a/car_product/sepolicy/netmgrd.te b/car_product/sepolicy/netmgrd.te
new file mode 100644
index 0000000..d87f690
--- /dev/null
+++ b/car_product/sepolicy/netmgrd.te
@@ -0,0 +1,28 @@
+type netmgrd, domain;
+type netmgrd_exec, exec_type, file_type;
+
+init_daemon_domain(netmgrd)
+net_domain(netmgrd)
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(netmgrd)
+
+# Allow writing of ipv6 network properties
+allow netmgrd proc_net:file w_file_perms;
+
+# Allow netmgrd operations
+allow netmgrd self:capability { net_admin net_raw fsetid };
+
+# Allow execution of /system/bin/sh.
+allow netmgrd shell_exec:file rx_file_perms;
+
+# Allow execution of /system/bin/*.
+allow netmgrd system_file:file rx_file_perms;
+
+allow netmgrd toolbox_exec:file rx_file_perms;
+
+userdebug_or_eng(`
+    allow netmgrd diag_device:chr_file rw_file_perms;
+')
+
+dontaudit netmgrd self:capability sys_module;
diff --git a/car_product/sepolicy/property.te b/car_product/sepolicy/property.te
new file mode 100644
index 0000000..6282856
--- /dev/null
+++ b/car_product/sepolicy/property.te
@@ -0,0 +1,10 @@
+type ctl_mpdecision_prop, property_type;
+type ctl_netmgrd_prop, property_type;
+type ctl_qmuxd_prop, property_type;
+type ctl_quipc_igsn_prop, property_type;
+type ctl_quipc_main_prop, property_type;
+type ctl_thermal-engine_prop, property_type;
+type hw_cabl_prop, property_type;
+type wc_transport_prop, property_type;
+type wlan_driver_prop, property_type;
+type radio_atfwd_prop, property_type;
diff --git a/car_product/sepolicy/property_contexts b/car_product/sepolicy/property_contexts
new file mode 100644
index 0000000..4afc2ac
--- /dev/null
+++ b/car_product/sepolicy/property_contexts
@@ -0,0 +1,11 @@
+ctl.mpdecision             u:object_r:ctl_mpdecision_prop:s0
+ctl.netmgrd                u:object_r:ctl_netmgrd_prop:s0
+ctl.qmuxd                  u:object_r:ctl_qmuxd_prop:s0
+ctl.quipc_igsn             u:object_r:ctl_quipc_igsn_prop:s0
+ctl.quipc_main             u:object_r:ctl_quipc_main_prop:s0
+ctl.thermal-engine         u:object_r:ctl_thermal-engine_prop:s0
+hw.cabl.                   u:object_r:hw_cabl_prop:s0
+qualcomm.bluetooth.        u:object_r:bluetooth_prop:s0
+radio.atfwd.               u:object_r:radio_atfwd_prop:s0
+wc_transport.              u:object_r:wc_transport_prop:s0
+wlan.driver.               u:object_r:wlan_driver_prop:s0
diff --git a/car_product/sepolicy/qcom-c_core-sh.te b/car_product/sepolicy/qcom-c_core-sh.te
new file mode 100644
index 0000000..6892820
--- /dev/null
+++ b/car_product/sepolicy/qcom-c_core-sh.te
@@ -0,0 +1,15 @@
+# qcom-c_core-sh service
+type qcom-c_core-sh, domain;
+type qcom-c_core-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-c_core-sh)
+
+# Set ctl.console properties.
+set_prop(qcom-c_core-sh, ctl_console_prop)
+
+allow qcom-c_core-sh shell_exec:file r_file_perms;
+
+allow qcom-c_core-sh toolbox_exec:file rx_file_perms;
+
+allow qcom-c_core-sh sysfs:file r_file_perms;
diff --git a/car_product/sepolicy/qcom-c_main-sh.te b/car_product/sepolicy/qcom-c_main-sh.te
new file mode 100644
index 0000000..c8a1eed
--- /dev/null
+++ b/car_product/sepolicy/qcom-c_main-sh.te
@@ -0,0 +1,16 @@
+# qcom-c_main-sh service
+type qcom-c_main-sh, domain;
+type qcom-c_main-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-c_main-sh)
+
+# Set ctl.qmuxd property.
+set_prop(qcom-c_main-sh, ctl_qmuxd_prop)
+
+# Set ctl.netmgrd property.
+set_prop(qcom-c_main-sh, ctl_netmgrd_prop)
+
+allow qcom-c_main-sh shell_exec:file r_file_perms;
+
+allow qcom-c_main-sh toolbox_exec:file rx_file_perms;
diff --git a/car_product/sepolicy/qcom-post-boot.te b/car_product/sepolicy/qcom-post-boot.te
new file mode 100644
index 0000000..3d54b84
--- /dev/null
+++ b/car_product/sepolicy/qcom-post-boot.te
@@ -0,0 +1,50 @@
+# qcom-post-boot service
+type qcom-post-boot, domain;
+type qcom-post-boot_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-post-boot)
+
+# Set ctl.thermal-engine property.
+set_prop(qcom-post-boot, ctl_thermal-engine_prop);
+
+# Set ctl.mpdecision property.
+set_prop(qcom-post-boot, ctl_mpdecision_prop);
+
+# Allow access to /dev/ttyHS0.
+allow qcom-post-boot serial_device:chr_file { getattr setattr };
+
+allow qcom-post-boot shell_exec:file r_file_perms;
+
+# Write access to thermal related sysfs nodes.
+allow qcom-post-boot sysfs_thermal:dir search;
+allow qcom-post-boot sysfs_thermal:file w_file_perms;
+
+# Access to /sys/module/rpm_resources/*.
+allow qcom-post-boot sysfs_rpm_resources:dir search;
+allow qcom-post-boot sysfs_rpm_resources:file w_file_perms;
+
+# Write access to mpdecision related sysfs nodes.
+allow qcom-post-boot sysfs_mpdecision:dir search;
+allow qcom-post-boot sysfs_mpdecision:file { rw_file_perms setattr };
+
+# Access to /sys/module/msm_dcvs/*.
+allow qcom-post-boot sysfs_dcvs:dir search;
+allow qcom-post-boot sysfs_dcvs:file { rw_file_perms setattr };
+
+# Chown /sys/devices/platform/bt_power/*.
+allow qcom-post-boot sysfs_bt_power:dir search;
+allow qcom-post-boot sysfs_bt_power:file { getattr setattr };
+
+# Write access to /sys/devices/system/cpu/*.
+allow qcom-post-boot sysfs_devices_system_cpu:file { w_file_perms setattr };
+
+# Write access to dynamically generated files under /sys/devices/system/cpufreq/ondemand/*.
+allow qcom-post-boot sysfs:file { w_file_perms setattr };
+
+# Allow changing the owner of the above sysfs nodes.
+allow qcom-post-boot self:capability { fowner chown fsetid };
+
+allow qcom-post-boot sysfs:file r_file_perms;
+
+allow qcom-post-boot toolbox_exec:file rx_file_perms;
diff --git a/car_product/sepolicy/qcom-sh.te b/car_product/sepolicy/qcom-sh.te
new file mode 100644
index 0000000..1ae6c4f
--- /dev/null
+++ b/car_product/sepolicy/qcom-sh.te
@@ -0,0 +1,21 @@
+# qcom-sh service
+type qcom-sh, domain;
+type qcom-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-sh)
+
+# Set ctl.quipc_* property.
+set_prop(qcom-sh, ctl_quipc_igsn_prop)
+set_prop(qcom-sh, ctl_quipc_main_prop)
+
+allow qcom-sh self:capability net_admin;
+
+# Allow writing of ipv6 network properties
+allow qcom-sh proc_net:file w_file_perms;
+
+allow qcom-sh shell_exec:file r_file_perms;
+
+allow qcom-sh toolbox_exec:file rx_file_perms;
+
+allow qcom-sh sysfs:file r_file_perms;
diff --git a/car_product/sepolicy/qcom-usb-sh.te b/car_product/sepolicy/qcom-usb-sh.te
new file mode 100644
index 0000000..8d63782
--- /dev/null
+++ b/car_product/sepolicy/qcom-usb-sh.te
@@ -0,0 +1,29 @@
+# qcom-usb-sh service
+type qcom-usb-sh, domain;
+type qcom-usb-sh_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(qcom-usb-sh)
+
+# Allow changing the owner of /sys/devices/virtual/hsicctl/hsicctl0/modem_wait.
+allow qcom-usb-sh sysfs_hsic_modem_wait:file { getattr setattr };
+
+# qcom.usb.sh needs to restore the context of /sys/devices/virtual/hsicctl/hsicctl0/modem_wait
+# as it may not be properly labeled when accessed.
+allow qcom-usb-sh sysfs:file relabelfrom;
+allow qcom-usb-sh sysfs_hsic_modem_wait:file relabelto;
+
+# Follow links from /sys/class/android_usb/* to /sys/devices/virtual/android_usb/*.
+allow qcom-usb-sh sysfs_usb:lnk_file read;
+
+# Allow write access to USB related sysfs nodes.
+allow qcom-usb-sh sysfs_usb:dir search;
+allow qcom-usb-sh sysfs_usb:file w_file_perms;
+
+allow qcom-usb-sh self:capability chown;
+
+allow qcom-usb-sh shell_exec:file r_file_perms;
+
+allow qcom-usb-sh toolbox_exec:file rx_file_perms;
+
+allow qcom-usb-sh rootfs:file r_file_perms;
diff --git a/car_product/sepolicy/qmuxd.te b/car_product/sepolicy/qmuxd.te
new file mode 100644
index 0000000..e0b6dab
--- /dev/null
+++ b/car_product/sepolicy/qmuxd.te
@@ -0,0 +1,22 @@
+# qmuxd daemon
+type qmuxd, domain;
+type qmuxd_exec, exec_type, file_type;
+
+init_daemon_domain(qmuxd)
+net_domain(qmuxd)
+
+# Allow access to /dev/hsicctl*.
+allow qmuxd hsic_device:chr_file rw_file_perms;
+
+# Allow access to /sys/devices/virtual/smdpkt/smdcntl*/open_timeout.
+allow qmuxd sysfs_smd_open_timeout:file w_file_perms;
+
+# Allow access to /sys/devices/virtual/hsicctl/hsicctl*/modem_wait.
+allow qmuxd sysfs_hsic_modem_wait:file w_file_perms;
+
+userdebug_or_eng(`
+    allow qmuxd diag_device:chr_file rw_file_perms;
+')
+
+# Allow qmuxd to have the CAP_BLOCK_SUSPEND capability
+wakelock_use(qmuxd)
diff --git a/car_product/sepolicy/rild.te b/car_product/sepolicy/rild.te
new file mode 100644
index 0000000..ea450be
--- /dev/null
+++ b/car_product/sepolicy/rild.te
@@ -0,0 +1,6 @@
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(rild);
+
+userdebug_or_eng(`
+    allow rild diag_device:chr_file rw_file_perms;
+')
diff --git a/car_product/sepolicy/rmt_storage.te b/car_product/sepolicy/rmt_storage.te
new file mode 100644
index 0000000..d67a2ce
--- /dev/null
+++ b/car_product/sepolicy/rmt_storage.te
@@ -0,0 +1,32 @@
+# rmt_storage daemon
+type rmt_storage, domain;
+type rmt_storage_exec, exec_type, file_type;
+
+init_daemon_domain(rmt_storage)
+
+# Drop (user, group) to (nobody, nobody)
+allow rmt_storage self:capability { setuid setgid };
+
+# Opens and reads /dev/block/mmcblk0.
+allow rmt_storage root_block_device:blk_file r_file_perms;
+
+# Allow access to /dev/uio0.
+allow rmt_storage uio_device:chr_file rw_file_perms;
+
+# Allow access to /dev/smem_log.
+allow rmt_storage smem_log_device:chr_file rw_file_perms;
+
+# Allow access to modem related block devices.
+allow rmt_storage modem_block_device:blk_file rw_file_perms;
+
+# Allow access to SSD related block devices.
+allow rmt_storage ssd_block_device:blk_file rw_file_perms;
+
+allow rmt_storage self:socket create_socket_perms;
+
+allow rmt_storage sysfs:file r_file_perms;
+
+allow rmt_storage sysfs:dir r_dir_perms;
+
+# Wake lock access.
+wakelock_use(rmt_storage)
diff --git a/car_product/sepolicy/start_hci_filter.te b/car_product/sepolicy/start_hci_filter.te
new file mode 100644
index 0000000..95ce9e4
--- /dev/null
+++ b/car_product/sepolicy/start_hci_filter.te
@@ -0,0 +1,10 @@
+type start_hci_filter, domain;
+type start_hci_filter_exec, exec_type, file_type;
+
+init_daemon_domain(start_hci_filter);
+
+# Allow access to /dev/ttyHS0
+allow start_hci_filter serial_device:chr_file rw_file_perms;
+
+# Allow access to wc_transport.* properties.
+set_prop(start_hci_filter, wc_transport_prop)
diff --git a/car_product/sepolicy/system_app.te b/car_product/sepolicy/system_app.te
new file mode 100644
index 0000000..aaa99c2
--- /dev/null
+++ b/car_product/sepolicy/system_app.te
@@ -0,0 +1 @@
+binder_call(system_app, vns);
diff --git a/car_product/sepolicy/system_server.te b/car_product/sepolicy/system_server.te
new file mode 100644
index 0000000..507f8ca
--- /dev/null
+++ b/car_product/sepolicy/system_server.te
@@ -0,0 +1,17 @@
+# Set wlan.driver.* properties.
+set_prop(system_server, wlan_driver_prop)
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(system_server)
+
+# For gss
+allow system_server gss_device:chr_file rw_file_perms;
+
+userdebug_or_eng(`
+    allow system_server diag_device:chr_file rw_file_perms;
+')
+
+r_dir_file(system_server, sysfs_usb)
+allow system_server sysfs_usb:file w_file_perms;
+
+dontaudit system_server self:capability sys_module;
diff --git a/car_product/sepolicy/te_macros b/car_product/sepolicy/te_macros
new file mode 100644
index 0000000..485bfb7
--- /dev/null
+++ b/car_product/sepolicy/te_macros
@@ -0,0 +1,11 @@
+#####################################
+# qmux_socket(clientdomain)
+# Allow client domain to connecto and send
+# via a local socket to the qmux domain.
+# Also allow the client domain to remove
+# its own socket.
+define(`qmux_socket', `
+allow $1 qmuxd_socket:dir create_dir_perms;
+unix_socket_connect($1, qmuxd, qmuxd)
+allow $1 qmuxd_socket:sock_file { read getattr write setattr create unlink };
+')
diff --git a/car_product/sepolicy/thermal-engine.te b/car_product/sepolicy/thermal-engine.te
new file mode 100644
index 0000000..aa9224f
--- /dev/null
+++ b/car_product/sepolicy/thermal-engine.te
@@ -0,0 +1,38 @@
+# Thermal-engine daemon
+type thermal-engine, domain;
+type thermal-engine_exec, exec_type, file_type;
+
+init_daemon_domain(thermal-engine)
+
+userdebug_or_eng(`
+    allow thermal-engine diag_device:chr_file rw_file_perms;
+')
+
+allow thermal-engine self:capability { net_admin fsetid };
+
+allow thermal-engine self:netlink_kobject_uevent_socket create_socket_perms;
+
+# Allow access to /dev/smem_log.
+allow thermal-engine smem_log_device:chr_file rw_file_perms;
+
+# Access to /dev/socket/thermal-.*
+allow thermal-engine thermal_socket:sock_file rw_file_perms;
+
+# Access to /dev/socket/mpdecision.
+unix_socket_connect(thermal-engine, mpdecision, mpdecision);
+
+# Allow access to /dev/uio0.
+#allow rmt_storage uio_device:chr_file rw_file_perms;
+
+# Write access to thermal related sysfs nodes.
+r_dir_file(thermal-engine, sysfs_thermal)
+allow thermal-engine sysfs_thermal:file w_file_perms;
+
+# Creates/Talks to qmuxd via the qmux_radio socket.
+qmux_socket(thermal-engine);
+
+allow thermal-engine self:socket create_socket_perms;
+
+allow thermal-engine sysfs_thermal:file r_file_perms;
+
+allow thermal-engine sysfs_thermal:dir r_dir_perms;
diff --git a/car_product/sepolicy/time_daemon.te b/car_product/sepolicy/time_daemon.te
new file mode 100644
index 0000000..782da98
--- /dev/null
+++ b/car_product/sepolicy/time_daemon.te
@@ -0,0 +1,19 @@
+# Policies for time daemon
+type time_daemon, domain;
+type time_daemon_exec, exec_type, file_type;
+
+init_daemon_domain(time_daemon)
+
+# Allow access to /dev/smem_log.
+allow time_daemon smem_log_device:chr_file rw_file_perms;
+
+# Add rules for access permissions
+allow time_daemon rtc_device:chr_file r_file_perms;
+allow time_daemon alarm_device:chr_file rw_file_perms;
+
+# Allo access to /data/time/*.
+allow time_daemon time_data_file:file r_file_perms;
+
+allow time_daemon self:socket create_socket_perms;
+
+allow time_daemon self:capability { setuid setgid };
diff --git a/car_product/sepolicy/ueventd.te b/car_product/sepolicy/ueventd.te
new file mode 100644
index 0000000..f898e27
--- /dev/null
+++ b/car_product/sepolicy/ueventd.te
@@ -0,0 +1,11 @@
+# Allow read access to firmware related files.
+r_dir_file(ueventd, firmware_file);
+
+# Write access to thermal related sysfs nodes.
+allow ueventd sysfs_thermal:file w_file_perms;
+
+# Allow write access to usb related sysfs nodes.
+allow ueventd sysfs_usb:file w_file_perms;
+
+# Allow write access to bt_power sysfs nodes.
+allow ueventd sysfs_bt_power:file w_file_perms;
diff --git a/car_product/sepolicy/usf-post-boot.te b/car_product/sepolicy/usf-post-boot.te
new file mode 100644
index 0000000..e21f583
--- /dev/null
+++ b/car_product/sepolicy/usf-post-boot.te
@@ -0,0 +1,8 @@
+# usf-post-boot service
+type usf-post-boot, domain;
+type usf-post-boot_exec, exec_type, file_type;
+
+# Started by init
+init_daemon_domain(usf-post-boot)
+
+allow usf-post-boot shell_exec:file r_file_perms;
diff --git a/car_product/sepolicy/vns.te b/car_product/sepolicy/vns.te
new file mode 100644
index 0000000..ff5f1f8
--- /dev/null
+++ b/car_product/sepolicy/vns.te
@@ -0,0 +1,7 @@
+# Vehicle network service
+type vns, domain;
+type vns_exec, exec_type, file_type;
+
+init_daemon_domain(vns)
+
+binder_use(vns);
diff --git a/car_product/sepolicy/wcnss_service.te b/car_product/sepolicy/wcnss_service.te
new file mode 100644
index 0000000..fb97c43
--- /dev/null
+++ b/car_product/sepolicy/wcnss_service.te
@@ -0,0 +1,17 @@
+# WCNSS service
+type wcnss_service, domain;
+type wcnss_service_exec, exec_type, file_type;
+
+init_daemon_domain(wcnss_service)
+net_domain(wcnss_service)
+
+unix_socket_connect(wcnss_service, property, init)
+
+# Allow creation and modification of wifi data files.
+allow wcnss_service wifi_data_file:file create_file_perms;
+
+# Allow modifications of /dev/wcnss_* devices.
+allow wcnss_service wcnss_device:chr_file rw_file_perms;
+
+# Set wlan.driver.* properties.
+set_prop(wcnss_service, wlan_driver_prop)
diff --git a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
index 5e627a9..de792ed 100644
--- a/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
+++ b/libvehiclenetwork/java/src/com/android/car/vehiclenetwork/VehicleNetworkConsts.java
@@ -468,10 +468,10 @@
 }
 
 public static class VehicleAudioHwVariantConfigFlag {
-public static final int VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG = 0x1;
+public static final int VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG = 0x1;
 public static String enumToString(int v) {
 switch(v) {
-case VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG: return "VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG";
+case VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG: return "VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG";
 default: return "UNKNOWN";
 }
 }
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index 24ef730..f45480f 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -38,10 +38,13 @@
 		 vehicle HAL.-->
     <string-array translatable="false" name="audioRoutingPolicy">
         <!--  alll logical streams into single physical stream 0. -->
-        <item>"0:call,media,nav_guidance,voice_command,alarm,notification,system,safety,unknown"</item>
+        <item>"0:call,media,radio,nav_guidance,voice_command,alarm,notification,system,safety,unknown"</item>
         <!--  call and media to physical stream 0 while all others go to physical stream 1 -->
-        <item>"0:call,media,unknown#1:nav_guidance,voice_command,alarm,notification,system,safety"</item>
+        <item>"0:call,media,radio,unknown#1:nav_guidance,voice_command,alarm,notification,system,safety"</item>
     </string-array>
+    <!-- Timeout value in Ms for audio focus wait. Audio focus request not responsed within
+         this value will be treated as timeout and audio focus will be reset to LOSS state. -->
+    <integer name="audioFocusWaitTimeoutMs">1000</integer>
 
     <!-- This is kernel device node to allow input event injection for key inputs coming
          from vehicle hal -->
diff --git a/service/src/com/android/car/AudioRoutingPolicy.java b/service/src/com/android/car/AudioRoutingPolicy.java
index 39ad826..fdad5aa 100644
--- a/service/src/com/android/car/AudioRoutingPolicy.java
+++ b/service/src/com/android/car/AudioRoutingPolicy.java
@@ -44,13 +44,13 @@
     }
 
     private static int getStreamType(String str) {
-        // no radio here as radio routing is outside android (for external module) or same as music
-        // (for android internal module)
         switch (str) {
             case "call":
                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
             case "media":
                 return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
+            case "radio":
+                return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
             case "nav_guidance":
                 return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
             case "voice_command":
@@ -101,20 +101,8 @@
         }
         for (int i = 0; i < mPhysicalStreamForLogicalStream.length; i++) {
             if (mPhysicalStreamForLogicalStream[i] == USAGE_TYPE_INVALID) {
-                if (i == CarAudioManager.CAR_AUDIO_USAGE_RADIO) {
-                    // set radio routing to be the same as music. For external radio, this does not
-                    // matter. For internal one, it should be the same as music.
-                    int musicPhysicalStream =
-                            mPhysicalStreamForLogicalStream[CarAudioManager.CAR_AUDIO_USAGE_MUSIC];
-                    if (musicPhysicalStream == USAGE_TYPE_INVALID) {
-                        musicPhysicalStream = defaultStreamType;
-                    }
-                    mPhysicalStreamForLogicalStream[i] = musicPhysicalStream;
-                } else {
-                    Log.w(CarLog.TAG_AUDIO, "Audio routing policy did not cover logical stream " +
-                            i);
-                    mPhysicalStreamForLogicalStream[i] = defaultStreamType;
-                }
+                Log.w(CarLog.TAG_AUDIO, "Audio routing policy did not cover logical stream " + i);
+                mPhysicalStreamForLogicalStream[i] = defaultStreamType;
             }
         }
     }
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
index 82e5610..2632c02 100644
--- a/service/src/com/android/car/CarAudioService.java
+++ b/service/src/com/android/car/CarAudioService.java
@@ -18,6 +18,7 @@
 import android.car.media.CarAudioManager;
 import android.car.media.ICarAudio;
 import android.content.Context;
+import android.content.res.Resources;
 import android.media.AudioAttributes;
 import android.media.AudioFocusInfo;
 import android.media.AudioManager;
@@ -50,7 +51,7 @@
         void onContextChange(int primaryFocusContext, int primaryFocusPhysicalStream);
     }
 
-    private static final long FOCUS_RESPONSE_WAIT_TIMEOUT_MS = 1000;
+    private final long mFocusResponseWaitTimeoutMs;
 
     private static final String TAG_FOCUS = CarLog.TAG_AUDIO + ".FOCUS";
 
@@ -61,9 +62,11 @@
     private final HandlerThread mFocusHandlerThread;
     private final CarAudioFocusChangeHandler mFocusHandler;
     private final SystemFocusListener mSystemFocusListener;
-    private AudioPolicy mAudioPolicy;
+
     private final Object mLock = new Object();
     @GuardedBy("mLock")
+    private AudioPolicy mAudioPolicy;
+    @GuardedBy("mLock")
     private FocusState mCurrentFocusState = FocusState.STATE_LOSS;
     /** Focus state received, but not handled yet. Once handled, this will be set to null. */
     @GuardedBy("mLock")
@@ -100,6 +103,8 @@
     private AudioContextChangeListener mAudioContextChangeListener;
     @GuardedBy("mLock")
     private CarAudioContextChangeHandler mCarAudioContextChangeHandler;
+    @GuardedBy("mLock")
+    private boolean mIsRadioExternal;
 
     private final AudioAttributes mAttributeBottom =
             CarAudioAttributesUtil.getAudioAttributesForCarUsage(
@@ -116,6 +121,9 @@
         mFocusHandlerThread.start();
         mFocusHandler = new CarAudioFocusChangeHandler(mFocusHandlerThread.getLooper());
         mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+        Resources res = context.getResources();
+        mFocusResponseWaitTimeoutMs = (long) res.getInteger(R.integer.audioFocusWaitTimeoutMs);
+
     }
 
     @Override
@@ -131,7 +139,9 @@
         if (isFocusSuported) {
             builder.setAudioPolicyFocusListener(mSystemFocusListener);
         }
-        mAudioPolicy = builder.build();
+        synchronized (mLock) {
+            mAudioPolicy = builder.build();
+        }
         if (isFocusSuported) {
             FocusState currentState = FocusState.create(mAudioHal.getCurrentFocusState());
             int r = mAudioManager.requestAudioFocus(mBottomAudioFocusHandler, mAttributeBottom,
@@ -152,7 +162,10 @@
         }
         mAudioHal.setFocusListener(this);
         int audioHwVariant = mAudioHal.getHwVariant();
-        mAudioRoutingPolicy = AudioRoutingPolicy.create(mContext, audioHwVariant);
+        synchronized (mLock) {
+            mAudioRoutingPolicy = AudioRoutingPolicy.create(mContext, audioHwVariant);
+            mIsRadioExternal = mAudioHal.isRadioExternal();
+        }
         mAudioHal.setAudioRoutingPolicy(mAudioRoutingPolicy);
         //TODO set routing policy with new AudioPolicy API. This will control which logical stream
         //     goes to which physical stream.
@@ -200,6 +213,7 @@
         writer.println(" mCallActive:" + mCallActive + " mRadioActive:" + mRadioActive);
         writer.println(" mCurrentPrimaryAudioContext:" + mCurrentPrimaryAudioContext +
                 " mCurrentPrimaryPhysicalStream:" + mCurrentPrimaryPhysicalStream);
+        writer.println(" mIsRadioExternal:" + mIsRadioExternal);
         mAudioRoutingPolicy.dump(writer);
     }
 
@@ -389,8 +403,8 @@
         return false;
     }
 
-    private boolean isFocusFromRadio(AudioFocusInfo info) {
-        if (!mAudioHal.isRadioExternal()) {
+    private boolean isFocusFromExternalRadio(AudioFocusInfo info) {
+        if (!mIsRadioExternal) {
             // if radio is not external, no special handling of radio is necessary.
             return false;
         }
@@ -455,21 +469,14 @@
         // update primary context and notify if necessary
         int primaryContext = logicalStreamTypeForTop;
         switch (logicalStreamTypeForTop) {
-            case CarAudioAttributesUtil.CAR_AUDIO_TYPE_CARSERVICE_BOTTOM:
-            case CarAudioAttributesUtil.CAR_AUDIO_TYPE_CARSERVICE_CAR_PROXY:
+            case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
+            case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
                 primaryContext = 0;
                 break;
         }
         if (mCurrentPrimaryAudioContext != primaryContext) {
             mCurrentPrimaryAudioContext = primaryContext;
-            if (primaryContext == CarAudioManager.CAR_AUDIO_USAGE_RADIO) {
-                // policy does not know radio. treat it same as music.
-                mCurrentPrimaryPhysicalStream =
-                        mAudioRoutingPolicy.getPhysicalStreamForLogicalStream(
-                                CarAudioManager.CAR_AUDIO_USAGE_MUSIC);
-            } else {
-                mCurrentPrimaryPhysicalStream = physicalStreamTypeForTop;
-            }
+             mCurrentPrimaryPhysicalStream = physicalStreamTypeForTop;
             if (mCarAudioContextChangeHandler != null) {
                 mCarAudioContextChangeHandler.requestContextChangeNotification(
                         mAudioContextChangeListener, primaryContext, physicalStreamTypeForTop);
@@ -495,10 +502,8 @@
         int streamsToRequest = 0x1 << physicalStreamTypeForTop;
         switch (mTopFocusInfo.getGainRequest()) {
             case AudioManager.AUDIOFOCUS_GAIN:
-                if (isFocusFromRadio(mTopFocusInfo)) {
+                if (isFocusFromExternalRadio(mTopFocusInfo)) {
                     mRadioActive = true;
-                    // audio context sending is only for audio from android.
-                    audioContexts = 0;
                 } else {
                     mRadioActive = false;
                 }
@@ -541,9 +546,9 @@
             //     Most cars do not allow that, but if mixing is possible, it can take media stream.
             //     For now, assume no mixing capability.
             int radioPhysicalStream = mAudioRoutingPolicy.getPhysicalStreamForLogicalStream(
-                    CarAudioManager.CAR_AUDIO_USAGE_MUSIC);
-            if (!isFocusFromRadio(mTopFocusInfo) &&
-                    (physicalStreamTypeForTop == radioPhysicalStream)) {
+                    CarAudioManager.CAR_AUDIO_USAGE_RADIO);
+            if (!isFocusFromExternalRadio(mTopFocusInfo) &&
+                    (physicalStreamTypeForTop == radioPhysicalStream) && mIsRadioExternal) {
                 Log.i(CarLog.TAG_AUDIO, "Top stream is taking the same stream:" +
                     physicalStreamTypeForTop + " as radio, stopping radio");
                 // stream conflict here. radio cannot be played
@@ -589,7 +594,7 @@
             mAudioHal.requestAudioFocusChange(focusToRequest, streamsToRequest, extFocus,
                     audioContexts);
             try {
-                mLock.wait(FOCUS_RESPONSE_WAIT_TIMEOUT_MS);
+                mLock.wait(mFocusResponseWaitTimeoutMs);
             } catch (InterruptedException e) {
                 //ignore
             }
@@ -704,7 +709,7 @@
                 mAudioHal.requestAudioFocusChange(
                         AudioHalService.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE, 0, 0);
                 try {
-                    mLock.wait(FOCUS_RESPONSE_WAIT_TIMEOUT_MS);
+                    mLock.wait(mFocusResponseWaitTimeoutMs);
                 } catch (InterruptedException e) {
                     //ignore
                 }
diff --git a/service/src/com/android/car/hal/AudioHalService.java b/service/src/com/android/car/hal/AudioHalService.java
index a8edeeb..d9906cd 100644
--- a/service/src/com/android/car/hal/AudioHalService.java
+++ b/service/src/com/android/car/hal/AudioHalService.java
@@ -260,7 +260,7 @@
             return true;
         }
         return (config.getConfigArray(0) &
-                VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_PASS_RADIO_AUDIO_FOCUS_FLAG)
+                VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG)
                 == 0;
     }
 
diff --git a/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java b/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java
index 0d4e78d..82f52d5 100644
--- a/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java
+++ b/tests/android_car_api_test/src/com/android/car/apitest/CarHvacManagerTest.java
@@ -76,7 +76,7 @@
                 assertTrue(property.isZonedProperty());
                 checkFloatMinMax((CarHvacFloatProperty) property);
                 break;
-            case CarHvacManager.HVAC_ZONED_TEMP_IS_FARENHEIT: // zoned boolean
+            case CarHvacManager.HVAC_ZONED_TEMP_IS_FAHRENHEIT: // zoned boolean
             case CarHvacManager.HVAC_ZONED_AC_ON:
             case CarHvacManager.HVAC_WINDOW_DEFROSTER_ON:
                 assertEquals(CarHvacManager.PROPERTY_TYPE_BOOLEAN, property.getType());
diff --git a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
index 72e97e0..371a9a5 100644
--- a/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
+++ b/tests/carservice_test/src/com/android/car/test/AudioRoutingPolicyTest.java
@@ -117,6 +117,7 @@
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
+                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG |
@@ -138,6 +139,7 @@
         assertEquals(
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG |
+                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG |
                 VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
                 v.getInt32Values(
                         VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS)
diff --git a/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java b/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
index 180b3ef..29a020e 100644
--- a/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
+++ b/tests/carservice_test/src/com/android/car/test/CarAudioFocusTest.java
@@ -361,8 +361,7 @@
         assertEquals(0, request[1]);
         assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
                 request[2]);
-        // no android side context for radio
-        assertEquals(0, request[3]);
+        assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
         mAudioFocusPropertyHandler.sendAudioFocusState(
                 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
                 0,
@@ -382,7 +381,8 @@
         assertEquals(0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1, request[1]);
         assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
                 request[2]);
-        assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG, request[3]);
+        assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG |
+                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
         mAudioFocusPropertyHandler.sendAudioFocusState(
                 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
                 0x1 << VehicleAudioStream.VEHICLE_AUDIO_STREAM1,
@@ -396,7 +396,7 @@
         assertEquals(0, request[1]);
         assertEquals(VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG,
                 request[2]);
-        assertEquals(0, request[3]);
+        assertEquals(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG, request[3]);
         mAudioFocusPropertyHandler.sendAudioFocusState(
                 VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN,
                 0,