diff --git a/service/src/com/android/car/BootReceiver.java b/service/src/com/android/car/BootReceiver.java
index ea96ca6..10c6f2f 100644
--- a/service/src/com/android/car/BootReceiver.java
+++ b/service/src/com/android/car/BootReceiver.java
@@ -23,8 +23,6 @@
 import android.os.UserHandle;
 import android.util.Log;
 
-import com.android.car.hal.VehicleHal;
-
 
 /**
  *  When system boots up, start car service.
@@ -34,10 +32,9 @@
     @Override
     public void onReceive(Context context, Intent intent) {
         Log.w(CarLog.TAG_SERVICE, "Starting...");
-        VehicleHal hal = VehicleHal.getInstance();
-        Intent carServiceintent = new Intent();
-        carServiceintent.setPackage(context.getPackageName());
-        carServiceintent.setAction(Car.CAR_SERVICE_INTERFACE_NAME);
-        context.startServiceAsUser(carServiceintent, UserHandle.SYSTEM);
+        Intent carServiceIntent = new Intent();
+        carServiceIntent.setPackage(context.getPackageName());
+        carServiceIntent.setAction(Car.CAR_SERVICE_INTERFACE_NAME);
+        context.startServiceAsUser(carServiceIntent, UserHandle.SYSTEM);
     }
 }
diff --git a/service/src/com/android/car/CarAudioService.java b/service/src/com/android/car/CarAudioService.java
index 17df7a0..e23ac93 100644
--- a/service/src/com/android/car/CarAudioService.java
+++ b/service/src/com/android/car/CarAudioService.java
@@ -171,8 +171,9 @@
             CarAudioAttributesUtil.getAudioAttributesForCarUsage(
                     CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY);
 
-    public CarAudioService(Context context, CarInputService inputService) {
-        mAudioHal = VehicleHal.getInstance().getAudioHal();
+    public CarAudioService(Context context, AudioHalService audioHal,
+            CarInputService inputService) {
+        mAudioHal = audioHal;
         mContext = context;
         mFocusHandlerThread = new HandlerThread(CarLog.TAG_AUDIO);
         mSystemFocusListener = new SystemFocusListener();
@@ -221,10 +222,6 @@
         AudioPolicy audioPolicy = null;
         if (isFocusSupported || mUseDynamicRouting) {
             audioPolicy = builder.build();
-            int r = mAudioManager.registerAudioPolicy(audioPolicy);
-            if (r != 0) {
-                throw new RuntimeException("registerAudioPolicy failed " + r);
-            }
         }
         mAudioHal.setFocusListener(this);
         mAudioHal.setAudioRoutingPolicy(audioRoutingPolicy);
@@ -287,6 +284,12 @@
             Arrays.fill(mExternalRoutings, 0);
         }
         mVolumeService.init();
+
+        // Register audio policy only after this class is fully initialized.
+        int r = mAudioManager.registerAudioPolicy(audioPolicy);
+        if (r != 0) {
+            throw new RuntimeException("registerAudioPolicy failed " + r);
+        }
     }
 
     private void setupDynamicRouting(AudioRoutingPolicy audioRoutingPolicy,
diff --git a/service/src/com/android/car/CarCabinService.java b/service/src/com/android/car/CarCabinService.java
index 47aaa76..cdf8635 100644
--- a/service/src/com/android/car/CarCabinService.java
+++ b/service/src/com/android/car/CarCabinService.java
@@ -18,14 +18,13 @@
 
 import android.car.Car;
 import android.content.Context;
-import com.android.car.CarLog;
-import com.android.car.hal.VehicleHal;
+
+import com.android.car.hal.CabinHalService;
 
 public class CarCabinService extends CarPropertyServiceBase {
 	private final static boolean DBG = false;
 
-    public CarCabinService(Context context) {
-        super(context, VehicleHal.getInstance().getCabinHal(), Car.PERMISSION_CAR_CABIN, DBG,
-                CarLog.TAG_CABIN);
+    public CarCabinService(Context context, CabinHalService cabinHal) {
+        super(context, cabinHal, Car.PERMISSION_CAR_CABIN, DBG, CarLog.TAG_CABIN);
     }
 }
diff --git a/service/src/com/android/car/CarCameraService.java b/service/src/com/android/car/CarCameraService.java
index 7d2608b..c1a71c4 100644
--- a/service/src/com/android/car/CarCameraService.java
+++ b/service/src/com/android/car/CarCameraService.java
@@ -16,9 +16,9 @@
 
 package com.android.car;
 
-import android.content.Context;
 import android.car.hardware.camera.CarCameraState;
 import android.car.hardware.camera.ICarCamera;
+import android.content.Context;
 import android.graphics.Rect;
 import android.util.Log;
 
@@ -45,7 +45,11 @@
         if (DBG) {
             Log.d(TAG, "init called");
         }
-        mModule = nativeOpen();
+        try {
+            mModule = nativeOpen();
+        } catch (UnsatisfiedLinkError ex) {
+            Log.e(TAG, "Failed to open camera module: " + ex.getMessage());
+        }
 
         if (mModule != 0) {
             int[] cameraType = nativeGetSupportedCameras(mModule);
diff --git a/service/src/com/android/car/CarHvacService.java b/service/src/com/android/car/CarHvacService.java
index 99745ee..e22a38d 100644
--- a/service/src/com/android/car/CarHvacService.java
+++ b/service/src/com/android/car/CarHvacService.java
@@ -18,13 +18,13 @@
 
 import android.car.Car;
 import android.content.Context;
-import com.android.car.hal.VehicleHal;
+
+import com.android.car.hal.HvacHalService;
 
 public class CarHvacService extends CarPropertyServiceBase {
-	private final static boolean DBG = false;
+    private final static boolean DBG = false;
 
-    public CarHvacService(Context context) {
-        super(context, VehicleHal.getInstance().getHvacHal(), Car.PERMISSION_CAR_HVAC, DBG,
-                CarLog.TAG_HVAC);
+    public CarHvacService(Context context, HvacHalService hvacHal) {
+        super(context, hvacHal, Car.PERMISSION_CAR_HVAC, DBG, CarLog.TAG_HVAC);
     }
 }
diff --git a/service/src/com/android/car/CarInfoService.java b/service/src/com/android/car/CarInfoService.java
index c51ee15..9715325 100644
--- a/service/src/com/android/car/CarInfoService.java
+++ b/service/src/com/android/car/CarInfoService.java
@@ -17,26 +17,21 @@
 
 import android.car.CarInfoManager;
 import android.car.ICarInfo;
-import android.car.annotation.ValueTypeDef;
 import android.content.Context;
 import android.os.Bundle;
 import android.provider.Settings;
 
 import com.android.car.hal.InfoHalService;
-import com.android.car.hal.VehicleHal;
 
 import java.io.PrintWriter;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
 
 public class CarInfoService extends ICarInfo.Stub implements CarServiceBase {
 
     private final InfoHalService mInfoHal;
     private final Context mContext;
 
-    public CarInfoService(Context context) {
-        mInfoHal = VehicleHal.getInstance().getInfoHal();
+    public CarInfoService(Context context, InfoHalService infoHal) {
+        mInfoHal = infoHal;
         mContext = context;
     }
 
diff --git a/service/src/com/android/car/CarInputService.java b/service/src/com/android/car/CarInputService.java
index 31c07d5..5ed9d49 100644
--- a/service/src/com/android/car/CarInputService.java
+++ b/service/src/com/android/car/CarInputService.java
@@ -60,6 +60,7 @@
     private static final boolean DBG = false;
 
     private final Context mContext;
+    private final InputHalService mInputHalService;
     private final TelecomManager mTelecomManager;
     private final InputManager mInputManager;
 
@@ -125,8 +126,9 @@
         }
     };
 
-    public CarInputService(Context context) {
+    public CarInputService(Context context, InputHalService inputHalService) {
         mContext = context;
+        mInputHalService = inputHalService;
         mTelecomManager = context.getSystemService(TelecomManager.class);
         mInputManager = context.getSystemService(InputManager.class);
     }
@@ -181,14 +183,13 @@
 
     @Override
     public void init() {
-        InputHalService hal = VehicleHal.getInstance().getInputHal();
-        if (!hal.isKeyInputSupported()) {
+        if (!mInputHalService.isKeyInputSupported()) {
             Log.w(CarLog.TAG_INPUT, "Hal does not support key input.");
             return;
         }
 
 
-        hal.setInputListener(this);
+        mInputHalService.setInputListener(this);
         mCarInputListenerBound = bindCarInputService();
     }
 
diff --git a/service/src/com/android/car/CarNightService.java b/service/src/com/android/car/CarNightService.java
index 0d3af67..497f77c 100644
--- a/service/src/com/android/car/CarNightService.java
+++ b/service/src/com/android/car/CarNightService.java
@@ -18,12 +18,10 @@
 
 import android.annotation.IntDef;
 import android.app.UiModeManager;
-import android.car.Car;
 import android.car.hardware.CarSensorEvent;
 import android.car.hardware.CarSensorManager;
 import android.car.hardware.ICarSensorEventListener;
 import android.content.Context;
-import android.content.pm.PackageManager;
 import android.util.Log;
 
 import java.io.PrintWriter;
@@ -104,8 +102,9 @@
         return mUiModeManager.getNightMode();
     }
 
-    CarNightService(Context context) {
+    CarNightService(Context context, CarSensorService sensorService) {
         mContext = context;
+        mCarSensorService = sensorService;
         mUiModeManager = (UiModeManager) mContext.getSystemService(Context.UI_MODE_SERVICE);
         if (mUiModeManager == null) {
             Log.w(CarLog.TAG_SENSOR,"Failed to get UI_MODE_SERVICE");
@@ -117,8 +116,6 @@
         if (DBG) {
             Log.d(CarLog.TAG_SENSOR,"CAR dayNight init.");
         }
-        mCarSensorService = (CarSensorService) ICarImpl.getInstance(mContext).getCarService(
-                Car.SENSOR_SERVICE);
         mCarSensorService.registerOrUpdateSensorListener(CarSensorManager.SENSOR_TYPE_NIGHT,
                 CarSensorManager.SENSOR_RATE_NORMAL, mICarSensorEventListener);
         CarSensorEvent currentState = mCarSensorService.getLatestSensorEvent(
diff --git a/service/src/com/android/car/CarPowerManagementService.java b/service/src/com/android/car/CarPowerManagementService.java
index 34a67fa..22f8b09 100644
--- a/service/src/com/android/car/CarPowerManagementService.java
+++ b/service/src/com/android/car/CarPowerManagementService.java
@@ -15,23 +15,15 @@
  */
 package com.android.car;
 
-import android.annotation.NonNull;
-import android.car.Car;
-import android.content.Context;
-import android.hardware.display.DisplayManager;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.Message;
-import android.os.PowerManager;
-import android.os.PowerManager.WakeLock;
 import android.os.SystemClock;
 import android.util.Log;
-import android.view.Display;
 
 import com.android.car.hal.PowerHalService;
 import com.android.car.hal.PowerHalService.PowerState;
-import com.android.car.hal.VehicleHal;
 import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 
@@ -95,23 +87,8 @@
         int getWakeupTime();
     }
 
-    /** Interface to abstract all system interaction. Separated for testing. */
-    public interface SystemInteface {
-        void setDisplayState(boolean on);
-        void releaseAllWakeLocks();
-        void shutdown();
-        void enterDeepSleep(int wakeupTimeSec);
-        void switchToPartialWakeLock();
-        void switchToFullWakeLock();
-        void startDisplayStateMonitoring(CarPowerManagementService service);
-        void stopDisplayStateMonitoring();
-        boolean isSystemSupportingDeepSleep();
-        boolean isWakeupCausedByTimer();
-    }
-
-    private final Context mContext;
     private final PowerHalService mHal;
-    private final SystemInteface mSystemInterface;
+    private final SystemInterface mSystemInterface;
     private final HandlerThread mHandlerThread;
     private final PowerHandler mHandler;
 
@@ -131,23 +108,10 @@
     @GuardedBy("this")
     private final LinkedList<PowerState> mPendingPowerStates = new LinkedList<>();
 
-    private final int SHUTDOWN_POLLING_INTERVAL_MS = 2000;
-    private final int SHUTDOWN_EXTEND_MAX_MS = 5000;
+    private final static int SHUTDOWN_POLLING_INTERVAL_MS = 2000;
+    private final static int SHUTDOWN_EXTEND_MAX_MS = 5000;
 
-    /**
-     * Constructor for full functionality.
-     */
-    public CarPowerManagementService(@NonNull Context context) {
-        this(context, VehicleHal.getInstance().getPowerHal(),
-                new SystemIntefaceImpl(context));
-    }
-
-    /**
-     * Constructor for full functionality. Can inject external interfaces
-     */
-    public CarPowerManagementService(@NonNull Context context, @NonNull PowerHalService powerHal,
-            @NonNull SystemInteface systemInterface) {
-        mContext = context;
+    public CarPowerManagementService(PowerHalService powerHal, SystemInterface systemInterface) {
         mHal = powerHal;
         mSystemInterface = systemInterface;
         mHandlerThread = new HandlerThread(CarLog.TAG_POWER);
@@ -161,7 +125,6 @@
      */
     @VisibleForTesting
     protected CarPowerManagementService() {
-        mContext = null;
         mHal = null;
         mSystemInterface = null;
         mHandlerThread = null;
@@ -174,7 +137,12 @@
         if (mHal.isPowerStateSupported()) {
             mHal.sendBootComplete();
             PowerState currentState = mHal.getCurrentPowerState();
-            onApPowerStateChange(currentState);
+            if (currentState != null) {
+                onApPowerStateChange(currentState);
+            } else {
+                Log.w(CarLog.TAG_POWER, "Unable to get get current power state during "
+                        + "initialization");
+            }
         } else {
             Log.w(CarLog.TAG_POWER, "Vehicle hal does not support power state yet.");
             onApPowerStateChange(new PowerState(PowerHalService.STATE_ON_FULL, 0));
@@ -246,7 +214,7 @@
             if (mCurrentState == null) {
                 return;
             }
-            if (mCurrentState.state != PowerHalService.STATE_SHUTDOWN_PREPARE) {
+            if (mCurrentState.mState != PowerHalService.STATE_SHUTDOWN_PREPARE) {
                 return;
             }
             if (mCurrentState.canEnterDeepSleep()) {
@@ -300,7 +268,7 @@
         }
 
         Log.i(CarLog.TAG_POWER, "Power state change:" + state);
-        switch (state.state) {
+        switch (state.mState) {
             case PowerHalService.STATE_ON_DISP_OFF:
                 handleDisplayOff(state);
                 notifyPowerOn(false);
@@ -415,9 +383,7 @@
         synchronized (this) {
             mLastSleepEntryTime = SystemClock.elapsedRealtime();
         }
-        if (!shouldDoFakeShutdown()) { // if it is mocked, do not enter sleep.
-            mSystemInterface.enterDeepSleep(wakeupTimeSec);
-        }
+        mSystemInterface.enterDeepSleep(wakeupTimeSec);
         mHal.sendSleepExit();
         for (PowerServiceEventListener listener : mListeners) {
             listener.onSleepExit();
@@ -426,7 +392,7 @@
             doHandlePreprocessing(false /*shuttingDown*/);
         } else {
             PowerState currentState = mHal.getCurrentPowerState();
-            if (needPowerStateChange(currentState)) {
+            if (currentState != null && needPowerStateChange(currentState)) {
                 onApPowerStateChange(currentState);
             } else { // power controller woke-up but no power state change. Just shutdown.
                 Log.w(CarLog.TAG_POWER, "external sleep wake up, but no power state change:" +
@@ -439,7 +405,7 @@
     private void doHandleNotifyPowerOn() {
         boolean displayOn = false;
         synchronized (this) {
-            if (mCurrentState != null && mCurrentState.state == PowerHalService.STATE_ON_FULL) {
+            if (mCurrentState != null && mCurrentState.mState == PowerHalService.STATE_ON_FULL) {
                 displayOn = true;
             }
         }
@@ -468,9 +434,7 @@
             wakeupTimeSec = getWakeupTime();
         }
         mHal.sendShutdownStart(wakeupTimeSec);
-        if (!shouldDoFakeShutdown()) {
-            mSystemInterface.shutdown();
-        }
+        mSystemInterface.shutdown();
     }
 
     private int getWakeupTime() {
@@ -517,15 +481,6 @@
         //TODO bug: 32065231
     }
 
-    private boolean shouldDoFakeShutdown() {
-        ICarImpl carImpl = ICarImpl.getInstance(mContext);
-        if (!carImpl.isInMocking()) {
-            return false;
-        }
-        CarTestService testService = (CarTestService) carImpl.getCarService(Car.TEST_SERVICE);
-        return !testService.shouldDoRealShutdownInMocking();
-    }
-
     public void handleMainDisplayChanged(boolean on) {
         mHandler.handleMainDisplayStateChange(on);
     }
@@ -611,151 +566,6 @@
         }
     }
 
-    private static class SystemIntefaceImpl implements SystemInteface {
-
-        private final PowerManager mPowerManager;
-        private final DisplayManager mDisplayManager;
-        private final WakeLock mFullWakeLock;
-        private final WakeLock mPartialWakeLock;
-        private final DisplayStateListener mDisplayListener;
-        private CarPowerManagementService mService;
-        private boolean mDisplayStateSet;
-
-        private SystemIntefaceImpl(Context context) {
-            mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
-            mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
-            mFullWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, CarLog.TAG_POWER);
-            mPartialWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
-                    CarLog.TAG_POWER);
-            mDisplayListener = new DisplayStateListener();
-        }
-
-        @Override
-        public void startDisplayStateMonitoring(CarPowerManagementService service) {
-            synchronized (this) {
-                mService = service;
-                mDisplayStateSet = isMainDisplayOn();
-            }
-            mDisplayManager.registerDisplayListener(mDisplayListener, service.getHandler());
-        }
-
-        @Override
-        public void stopDisplayStateMonitoring() {
-            mDisplayManager.unregisterDisplayListener(mDisplayListener);
-        }
-
-        @Override
-        public void setDisplayState(boolean on) {
-            synchronized (this) {
-                mDisplayStateSet = on;
-            }
-            if (on) {
-                switchToFullWakeLock();
-                Log.i(CarLog.TAG_POWER, "on display");
-                mPowerManager.wakeUp(SystemClock.uptimeMillis());
-            } else {
-                switchToPartialWakeLock();
-                Log.i(CarLog.TAG_POWER, "off display");
-                mPowerManager.goToSleep(SystemClock.uptimeMillis());
-            }
-        }
-
-        private boolean isMainDisplayOn() {
-            Display disp = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
-            return disp.getState() == Display.STATE_ON;
-        }
-
-        @Override
-        public void shutdown() {
-            mPowerManager.shutdown(false /* no confirm*/, null, true /* true */);
-        }
-
-        @Override
-        public void enterDeepSleep(int wakeupTimeSec) {
-            //TODO set wake up time, bug: 32061842
-            mPowerManager.goToSleep(SystemClock.uptimeMillis(),
-                    PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN,
-                    PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
-        }
-
-        @Override
-        public boolean isSystemSupportingDeepSleep() {
-            //TODO should return by checking some kernel suspend control sysfs, bug: 32061842
-            return false;
-        }
-
-        @Override
-        public void switchToPartialWakeLock() {
-            if (!mPartialWakeLock.isHeld()) {
-                mPartialWakeLock.acquire();
-            }
-            if (mFullWakeLock.isHeld()) {
-                mFullWakeLock.release();
-            }
-        }
-
-        @Override
-        public void switchToFullWakeLock() {
-            if (!mFullWakeLock.isHeld()) {
-                mFullWakeLock.acquire();
-            }
-            if (mPartialWakeLock.isHeld()) {
-                mPartialWakeLock.release();
-            }
-        }
-
-        @Override
-        public void releaseAllWakeLocks() {
-            if (mPartialWakeLock.isHeld()) {
-                mPartialWakeLock.release();
-            }
-            if (mFullWakeLock.isHeld()) {
-                mFullWakeLock.release();
-            }
-        }
-
-        @Override
-        public boolean isWakeupCausedByTimer() {
-            //TODO bug: 32061842, check wake up reason and do necessary operation information should
-            // come from kernel. it can be either power on or wake up for maintenance
-            // power on will involve GPIO trigger from power controller
-            // its own wakeup will involve timer expiration.
-            return false;
-        }
-
-        private void handleMainDisplayChanged() {
-            boolean isOn = isMainDisplayOn();
-            CarPowerManagementService service;
-            synchronized (this) {
-                if (mDisplayStateSet == isOn) { // same as what is set
-                    return;
-                }
-                service = mService;
-            }
-            service.handleMainDisplayChanged(isOn);
-        }
-
-        private class DisplayStateListener implements DisplayManager.DisplayListener {
-
-            @Override
-            public void onDisplayAdded(int displayId) {
-                //ignore
-            }
-
-            @Override
-            public void onDisplayChanged(int displayId) {
-                if (displayId == Display.DEFAULT_DISPLAY) {
-                    handleMainDisplayChanged();
-                }
-            }
-
-            @Override
-            public void onDisplayRemoved(int displayId) {
-                //ignore
-            }
-        }
-    }
-
     private class ShutdownProcessingTimerTask extends TimerTask {
         private final boolean mShutdownWhenCompleted;
         private final int mExpirationCount;
diff --git a/service/src/com/android/car/CarRadioService.java b/service/src/com/android/car/CarRadioService.java
index c59983c..d12c9ae 100644
--- a/service/src/com/android/car/CarRadioService.java
+++ b/service/src/com/android/car/CarRadioService.java
@@ -28,7 +28,6 @@
 import android.os.RemoteException;
 import android.util.Log;
 
-import com.android.car.hal.VehicleHal;
 import com.android.car.hal.RadioHalService;
 
 import java.io.PrintWriter;
@@ -46,8 +45,8 @@
         new HashMap<IBinder, RadioDeathRecipient>();
     private final Context mContext;
 
-    public CarRadioService(Context context) {
-        mRadioHal = VehicleHal.getInstance().getRadioHal();
+    public CarRadioService(Context context, RadioHalService radioHal) {
+        mRadioHal = radioHal;
         mContext = context;
     }
 
diff --git a/service/src/com/android/car/CarSensorService.java b/service/src/com/android/car/CarSensorService.java
index 748d3c2..e9ab453 100644
--- a/service/src/com/android/car/CarSensorService.java
+++ b/service/src/com/android/car/CarSensorService.java
@@ -32,11 +32,13 @@
 import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.util.ArrayMap;
 import android.util.Log;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 
-import com.android.car.hal.VehicleHal;
+import com.google.android.collect.Lists;
+
 import com.android.car.hal.SensorHalService;
 import com.android.car.hal.SensorHalServiceBase;
 import com.android.internal.annotations.GuardedBy;
@@ -81,9 +83,8 @@
     private final ReentrantLock mSensorLock = new ReentrantLock();
     /** hold clients callback  */
     @GuardedBy("mSensorLock")
-    private final LinkedList<SensorClient> mClients = new LinkedList<SensorClient>();
-    /** should be used only as temp data for event dispatching */
-    private final LinkedList<SensorClient> mClientDispatchList = new LinkedList<>();
+    private final LinkedList<SensorClient> mClients = new LinkedList<>();
+
     /** key: sensor type. */
     @GuardedBy("mSensorLock")
     private final SparseArray<SensorListeners> mSensorListeners = new SparseArray<>();
@@ -106,7 +107,7 @@
     private final HandlerThread mHandlerThread;
     private final SensorDispatchHandler mSensorDispatchHandler;
 
-    public CarSensorService(Context context) {
+    public CarSensorService(Context context, SensorHalService sensorHal) {
         mContext = context;
         if (ENABLE_DISPATCHING_LIMIT) {
             mHandlerThread = new HandlerThread("SENSOR", Process.THREAD_PRIORITY_AUDIO);
@@ -117,8 +118,8 @@
             mSensorDispatchHandler = null;
         }
         // This triggers sensor hal init as well.
-        mSensorHal = VehicleHal.getInstance().getSensorHal();
-        mDrivingStatePolicy = new DrivingStatePolicy(context);
+        mSensorHal = sensorHal;
+        mDrivingStatePolicy = new DrivingStatePolicy(context, this);
         mDayNightModePolicy = new DayNightModePolicy(context);
     }
 
@@ -154,8 +155,8 @@
                 mDayNightModePolicy.registerSensorListener(this);
             } else {
                 event = mSensorHal.getCurrentSensorValue(CarSensorManager.SENSOR_TYPE_NIGHT);
-                Log.i(CarLog.TAG_SENSOR, "initial daynight:" + ((event == null)?
-                        "not ready" : + event.intValues[0]));
+                Log.i(CarLog.TAG_SENSOR, "initial daynight: "
+                        + ((event == null) ? "not ready" : + event.intValues[0]));
             }
             if (event == null) {
                 event = DayNightModePolicy.getDefaultValue(CarSensorManager.SENSOR_TYPE_NIGHT);
@@ -226,6 +227,8 @@
     }
 
     private void processSensorData(List<CarSensorEvent> events) {
+        ArrayMap<SensorClient, List<CarSensorEvent>> eventsByClient = new ArrayMap<>();
+
         mSensorLock.lock();
         for (CarSensorEvent event: events) {
             SensorRecord record = mSensorRecords.get(event.sensorType);
@@ -239,24 +242,35 @@
                     //TODO recycle new event, bug: 32094595
                     continue;
                 }
+
                 SensorListeners listeners = mSensorListeners.get(event.sensorType);
-                if (listeners != null) {
-                    listeners.queueSensorEvent(event);
+                if (listeners == null) {
+                    continue;
+                }
+
+                for (SensorClientWithRate clientWithRate : listeners.mSensorClients) {
+                    SensorClient client = clientWithRate.getSensorClient();
+                    List<CarSensorEvent> clientEvents = eventsByClient.get(client);
+                    if (clientEvents == null) {
+                        clientEvents = new LinkedList<>();
+                        eventsByClient.put(client, clientEvents);
+                    }
+                    clientEvents.add(event);
                 }
             }
         }
-        mClientDispatchList.addAll(mClients);
         mSensorLock.unlock();
-        for (SensorClient client: mClientDispatchList) {
-            client.dispatchSensorUpdate();
+
+        for (ArrayMap.Entry<SensorClient, List<CarSensorEvent>> entry : eventsByClient.entrySet()) {
+            SensorClient client = entry.getKey();
+            List<CarSensorEvent> clientEvents = entry.getValue();
+
+            client.dispatchSensorUpdate(clientEvents);
         }
-        mClientDispatchList.clear();
     }
 
     /**
      * Received sensor data from car.
-     *
-     * @param event
      */
     @Override
     public void onSensorEvents(List<CarSensorEvent> events) {
@@ -325,15 +339,14 @@
             // If we have a cached event for this sensor, send the event.
             SensorRecord record = mSensorRecords.get(sensorType);
             if (record != null && record.lastEvent != null) {
-                sensorClient.queueSensorEvent(record.lastEvent);
-                sensorClient.dispatchSensorUpdate();
+                sensorClient.dispatchSensorUpdate(Lists.newArrayList(record.lastEvent));
             }
             if (sensorListeners == null) {
                 sensorListeners = new SensorListeners(rate);
                 mSensorListeners.put(sensorType, sensorListeners);
                 shouldStartSensors = true;
             } else {
-                oldRate = Integer.valueOf(sensorListeners.getRate());
+                oldRate = sensorListeners.getRate();
                 sensorClientWithRate = sensorListeners.findSensorClientWithRate(sensorClient);
             }
             if (sensorClientWithRate == null) {
@@ -635,7 +648,7 @@
     private SensorClient findSensorClientLocked(ICarSensorEventListener listener) {
         IBinder binder = listener.asBinder();
         for (SensorClient sensorClient : mClients) {
-            if (sensorClient.isHoldingListernerBinder(binder)) {
+            if (sensorClient.isHoldingListenerBinder(binder)) {
                 return sensorClient;
             }
         }
@@ -738,8 +751,6 @@
         /** callback for sensor events */
         private final ICarSensorEventListener mListener;
         private final SparseBooleanArray mActiveSensors = new SparseBooleanArray();
-        private final LinkedList<CarSensorEvent> mSensorsToDispatch =
-                new LinkedList<CarSensorEvent>();
 
         /** when false, it is already released */
         private volatile boolean mActive = true;
@@ -757,7 +768,7 @@
             return false;
         }
 
-        boolean isHoldingListernerBinder(IBinder listenerBinder) {
+        boolean isHoldingListenerBinder(IBinder listenerBinder) {
             return mListener.asBinder() == listenerBinder;
         }
 
@@ -794,17 +805,13 @@
             removeClient(this);
         }
 
-        void queueSensorEvent(CarSensorEvent event) {
-            mSensorsToDispatch.add(event);
-        }
-
-        void dispatchSensorUpdate() {
-            if (mSensorsToDispatch.size() == 0) {
+        void dispatchSensorUpdate(List<CarSensorEvent> events) {
+            if (events.size() == 0) {
                 return;
             }
             if (mActive) {
                 try {
-                    mListener.onSensorChanged(mSensorsToDispatch);
+                    mListener.onSensorChanged(events);
                 } catch (RemoteException e) {
                     //ignore. crash will be handled by death handler
                 }
@@ -813,14 +820,12 @@
                     Log.d(CarLog.TAG_SENSOR, "sensor update while client is already released");
                 }
             }
-            mSensorsToDispatch.clear();
         }
 
         void release() {
             if (mActive) {
                 mListener.asBinder().unlinkToDeath(this, 0);
                 mActiveSensors.clear();
-                mSensorsToDispatch.clear();
                 mActive = false;
             }
         }
@@ -920,12 +925,6 @@
             return null;
         }
 
-        void queueSensorEvent(CarSensorEvent event) {
-            for (SensorClientWithRate clientWithRate: mSensorClients) {
-                clientWithRate.getSensorClient().queueSensorEvent(event);
-            }
-        }
-
         void release() {
             for (SensorClientWithRate clientWithRate: mSensorClients) {
                 clientWithRate.mSensorClient.release();
diff --git a/service/src/com/android/car/CarService.java b/service/src/com/android/car/CarService.java
index 475d4de..37df29d 100644
--- a/service/src/com/android/car/CarService.java
+++ b/service/src/com/android/car/CarService.java
@@ -15,28 +15,40 @@
  */
 package com.android.car;
 
+import static android.os.SystemClock.elapsedRealtime;
+
+import android.annotation.Nullable;
 import android.app.Service;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.hardware.vehicle.V2_0.IVehicle;
 import android.os.Binder;
 import android.os.IBinder;
 import android.os.SystemProperties;
 import android.util.Log;
 
-import com.android.car.hal.VehicleHal;
-
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
 
 public class CarService extends Service {
 
-    // main thread only
+    /** Default vehicle HAL service name. */
+    private static final String VEHICLE_SERVICE_NAME = "Vehicle";
+
+    private static final long WAIT_FOR_VEHICLE_HAL_TIMEOUT_MS = 10_000;
+
     private ICarImpl mICarImpl;
 
     @Override
     public void onCreate() {
         Log.i(CarLog.TAG_SERVICE, "Service onCreate");
-        mICarImpl = ICarImpl.getInstance(this);
+        IVehicle vehicle = getVehicle(WAIT_FOR_VEHICLE_HAL_TIMEOUT_MS);
+        if (vehicle == null) {
+            throw new IllegalStateException("Vehicle HAL service is not available.");
+        }
+
+        mICarImpl = new ICarImpl(this, vehicle, SystemInterface.getDefault(this));
+        mICarImpl.init();
         SystemProperties.set("boot.car_service_created", "1");
         super.onCreate();
     }
@@ -44,7 +56,7 @@
     @Override
     public void onDestroy() {
         Log.i(CarLog.TAG_SERVICE, "Service onDestroy");
-        ICarImpl.releaseInstance();
+        mICarImpl.release();
         super.onDestroy();
     }
 
@@ -70,12 +82,30 @@
         }
         if (args == null || args.length == 0) {
             writer.println("*dump car service*");
-            writer.println("*dump HAL*");
-            VehicleHal.getInstance().dump(writer);
-            writer.println("*dump services*");
-            ICarImpl.getInstance(this).dump(writer);
+            mICarImpl.dump(writer);
         } else {
-            ICarImpl.getInstance(this).execShellCmd(args, writer);
+            mICarImpl.execShellCmd(args, writer);
         }
     }
+
+    @Nullable
+    private IVehicle getVehicle(long waitMilliseconds) {
+        IVehicle vehicle = getVehicle();
+        long start = elapsedRealtime();
+        while (vehicle == null && (start + waitMilliseconds) > elapsedRealtime()) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+                throw new RuntimeException("Sleep was interrupted", e);
+            }
+
+            vehicle = getVehicle();
+        }
+        return vehicle;
+    }
+
+    @Nullable
+    private IVehicle getVehicle() {
+        return IVehicle.getService(VEHICLE_SERVICE_NAME);
+    }
 }
\ No newline at end of file
diff --git a/service/src/com/android/car/CarServiceUtils.java b/service/src/com/android/car/CarServiceUtils.java
index b47e22c..5467401 100644
--- a/service/src/com/android/car/CarServiceUtils.java
+++ b/service/src/com/android/car/CarServiceUtils.java
@@ -16,17 +16,16 @@
 
 package com.android.car;
 
-import java.util.List;
-
 import android.content.Context;
 import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.Looper;
 import android.util.Log;
 
+import java.util.List;
+
 /** Utility class */
 public final class CarServiceUtils {
 
@@ -158,4 +157,13 @@
         }
         return array;
     }
+
+    public static byte[] toByteArray(List<Byte> list) {
+        final int size = list.size();
+        final byte[] array = new byte[size];
+        for (int i = 0; i < size; ++i) {
+            array[i] = list.get(i);
+        }
+        return array;
+    }
 }
diff --git a/service/src/com/android/car/CarTestService.java b/service/src/com/android/car/CarTestService.java
index 9541af1..ec1606c 100644
--- a/service/src/com/android/car/CarTestService.java
+++ b/service/src/com/android/car/CarTestService.java
@@ -15,41 +15,35 @@
  */
 package com.android.car;
 
-import android.car.test.CarTestManager;
+import android.car.Car;
 import android.car.test.ICarTest;
 import android.content.Context;
 import android.os.IBinder;
+import android.os.RemoteException;
 import android.util.Log;
 
-import com.android.car.hal.VehicleHal;
-import com.android.car.vehiclenetwork.IVehicleNetworkHalMock;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehiclePropValueParcelable;
-
 import java.io.PrintWriter;
-import java.util.NoSuchElementException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Service to allow testing / mocking vehicle HAL.
  * This service uses Vehicle HAL APIs directly (one exception) as vehicle HAL mocking anyway
  * requires accessing that level directly.
  */
-public class CarTestService extends ICarTest.Stub implements CarServiceBase {
+class CarTestService extends ICarTest.Stub implements CarServiceBase {
+
+    private static final String TAG = CarTestService.class.getSimpleName();
 
     private final Context mContext;
-    private final VehicleNetwork mVehicleNetwork;
     private final ICarImpl mICarImpl;
-    private boolean mInMocking = false;
-    private int mMockingFlags = 0;
-    private Exception mException = null;
-    private IVehicleNetworkHalMock mMock = null;
-    private final MockDeathRecipient mDeathRecipient = new MockDeathRecipient();
 
-    public CarTestService(Context context, ICarImpl carImpl) {
+    private final Map<IBinder, TokenDeathRecipient> mTokens = new HashMap<>();
+
+    CarTestService(Context context, ICarImpl carImpl) {
         mContext = context;
         mICarImpl = carImpl;
-        mVehicleNetwork = VehicleHal.getInstance().getVehicleNetwork();
     }
 
     @Override
@@ -67,124 +61,59 @@
     @Override
     public void dump(PrintWriter writer) {
         writer.println("*CarTestService*");
-        writer.println(" mInMocking:" + mInMocking);
+        writer.println(" mTokens:" + Arrays.toString(mTokens.entrySet().toArray()));
     }
 
     @Override
-    public void injectEvent(VehiclePropValueParcelable value) {
-        ICarImpl.assertVehicleHalMockPermission(mContext);
-        mVehicleNetwork.injectEvent(value.value);
-    }
+    public void stopCarService(IBinder token) throws RemoteException {
+        Log.d(TAG, "stopCarService, token: " + token);
+        ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
 
-    @Override
-    public void startMocking(final IVehicleNetworkHalMock mock, final int flags) {
-        ICarImpl.assertVehicleHalMockPermission(mContext);
-        CarServiceUtils.runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    synchronized (this) {
-                        mInMocking = true;
-                        mMockingFlags = flags;
-                        mException = null;
-                        if (mMock != null) {
-                            Log.w(CarLog.TAG_TEST,
-                                    "New mocking started while previous one is not stopped");
-                            try {
-                                mMock.asBinder().unlinkToDeath(mDeathRecipient, 0);
-                            } catch (NoSuchElementException e) {
-                                //ignore
-                            }
-                        }
-                        mMock = mock;
-                    }
-                    mock.asBinder().linkToDeath(mDeathRecipient, 0);
-                    mVehicleNetwork.startMocking(mock);
-                    mICarImpl.startMocking();
-                } catch (Exception e) {
-                    Log.w(CarLog.TAG_TEST, "startMocking failed", e);
-                    synchronized (this) {
-                        mException = e;
-                        mInMocking = false;
-                        mMockingFlags = 0;
-                    }
-                }
-                Log.i(CarLog.TAG_TEST, "start vehicle HAL mocking, flags:0x" +
-                        Integer.toHexString(flags));
-            }
-        });
         synchronized (this) {
-            if (mException != null) {
-                throw new IllegalStateException(mException);
+            if (mTokens.containsKey(token)) {
+                Log.w(TAG, "Calling stopCarService twice with the same token.");
+                return;
+            }
+
+            TokenDeathRecipient deathRecipient = new TokenDeathRecipient(token);
+            mTokens.put(token, deathRecipient);
+            token.linkToDeath(deathRecipient, 0);
+
+            if (mTokens.size() == 1) {
+                mICarImpl.release();
             }
         }
     }
 
     @Override
-    public void stopMocking(final IVehicleNetworkHalMock mock) {
-        ICarImpl.assertVehicleHalMockPermission(mContext);
-        CarServiceUtils.runOnMainSync(new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    synchronized (this) {
-                        if (!mInMocking) {
-                            throw new IllegalStateException("not in mocking");
-                        }
-                        if (mMock.asBinder() != mock.asBinder()) {
-                            throw new IllegalArgumentException("Try to stop mocking not owned");
-                        }
-                        try {
-                            mMock.asBinder().unlinkToDeath(mDeathRecipient, 0);
-                        } catch (NoSuchElementException e) {
-                            //ignore
-                        }
-                    }
-                    mVehicleNetwork.stopMocking(mock);
-                    mICarImpl.stopMocking();
-                    synchronized (this) {
-                        mInMocking = false;
-                        mMockingFlags = 0;
-                        mException = null;
-                        mMock = null;
-                    }
-                    Log.i(CarLog.TAG_TEST, "stop vehicle HAL mocking");
-                } catch (Exception e) {
-                    Log.w(CarLog.TAG_TEST, "stopMocking failed", e);
-                }
-            }
-        });
+    public void startCarService(IBinder token) throws RemoteException {
+        Log.d(TAG, "startCarService, token: " + token);
+        ICarImpl.assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
+        releaseToken(token);
     }
 
-    @Override
-    public boolean isPropertySupported(int property) {
-        VehiclePropConfigs configs = VehicleHal.getInstance().getVehicleNetwork().listProperties(
-                property);
-        return configs != null;
+    private synchronized void releaseToken(IBinder token) {
+        Log.d(TAG, "releaseToken, token: " + token);
+        DeathRecipient deathRecipient = mTokens.remove(token);
+        if (deathRecipient != null) {
+            token.unlinkToDeath(deathRecipient, 0);
+        }
+
+        if (mTokens.size() == 0) {
+            mICarImpl.init();
+        }
     }
 
-    public synchronized boolean isInMocking() {
-        return mInMocking;
-    }
+    private class TokenDeathRecipient implements DeathRecipient {
+        private final IBinder mToken;
 
-    public synchronized boolean shouldDoRealShutdownInMocking() {
-        return (mMockingFlags & CarTestManager.FLAG_MOCKING_REAL_SHUTDOWN) != 0;
-    }
+        TokenDeathRecipient(IBinder token) throws RemoteException {
+            mToken = token;
+        }
 
-    private class MockDeathRecipient implements IBinder.DeathRecipient {
         @Override
         public void binderDied() {
-            CarServiceUtils.runOnMainSync(() -> {
-               try {
-                   IVehicleNetworkHalMock mock;
-                   synchronized (this) {
-                       mock = mMock;
-                   }
-                   stopMocking(mock);
-               } catch (Exception e) {
-                   //ignore
-               }
-            });
+            releaseToken(mToken);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/service/src/com/android/car/CarVendorExtensionService.java b/service/src/com/android/car/CarVendorExtensionService.java
index 3808684..2e2d074 100644
--- a/service/src/com/android/car/CarVendorExtensionService.java
+++ b/service/src/com/android/car/CarVendorExtensionService.java
@@ -19,7 +19,7 @@
 import android.car.Car;
 import android.content.Context;
 
-import com.android.car.hal.VehicleHal;
+import com.android.car.hal.VendorExtensionHalService;
 
 /**
  * Service responsible for handling custom properties that were defined in vehicle HAL by OEMs.
@@ -28,8 +28,7 @@
 
     private final static boolean DEBUG = false;
 
-    public CarVendorExtensionService(Context context) {
-        super(context, VehicleHal.getInstance().getVendorExtensionHal(),
-                Car.PERMISSION_VENDOR_EXTENSION, DEBUG, CarLog.TAG_VENDOR_EXT);
+    public CarVendorExtensionService(Context context, VendorExtensionHalService vendorHal) {
+        super(context, vendorHal, Car.PERMISSION_VENDOR_EXTENSION, DEBUG, CarLog.TAG_VENDOR_EXT);
     }
 }
diff --git a/service/src/com/android/car/CarVolumeControllerFactory.java b/service/src/com/android/car/CarVolumeControllerFactory.java
index 79ada5a..ae7dc1b 100644
--- a/service/src/com/android/car/CarVolumeControllerFactory.java
+++ b/service/src/com/android/car/CarVolumeControllerFactory.java
@@ -30,7 +30,6 @@
 import android.telecom.TelecomManager;
 import android.util.ArrayMap;
 import android.util.Log;
-import android.util.Pair;
 import android.util.SparseArray;
 import android.view.KeyEvent;
 
@@ -229,9 +228,6 @@
                 new SparseArray<>(VolumeUtils.CAR_AUDIO_CONTEXT.length);
         // stream volume limit, the key is car audio context type
         @GuardedBy("this")
-        private final SparseArray<Integer> mCarContextVolumeMin =
-                new SparseArray<>(VolumeUtils.CAR_AUDIO_CONTEXT.length);
-        @GuardedBy("this")
         private final RemoteCallbackList<IVolumeController> mVolumeControllers =
                 new RemoteCallbackList<>();
         @GuardedBy("this")
@@ -374,19 +370,13 @@
         private void initVolumeLimitLocked() {
             for (int i : VolumeUtils.CAR_AUDIO_CONTEXT) {
                 int carStream = carContextToCarStream(i);
-                Pair<Integer, Integer> volumeMinMax = mHal.getStreamVolumeLimit(carStream);
-                int max;
-                int min;
-                if (volumeMinMax == null) {
+                Integer volumeMax = mHal.getStreamMaxVolume(carStream);
+                int max = volumeMax == null ? 0 : volumeMax;
+                if (max < 0) {
                     max = 0;
-                    min = 0;
-                } else {
-                    max = volumeMinMax.second >= 0 ? volumeMinMax.second : 0;
-                    min = volumeMinMax.first >=0 ? volumeMinMax.first : 0;
                 }
                 // get default stream volume limit first.
                 mCarContextVolumeMax.put(i, max);
-                mCarContextVolumeMin.put(i, min);
             }
         }
 
@@ -574,13 +564,7 @@
 
         @Override
         public int getStreamMinVolume(int stream) {
-            synchronized (this) {
-                if (VolumeUtils.carContextToAndroidStream(mCurrentContext) == stream) {
-                    return mCarContextVolumeMin.get(mCurrentContext);
-                } else {
-                    return mCarContextVolumeMin.get(VolumeUtils.androidStreamToCarContext(stream));
-                }
-            }
+            return 0;  // Min value is always zero.
         }
 
         @Override
@@ -669,8 +653,6 @@
                 dumpVolumes(writer, mCurrentCarContextVolume);
                 writer.println("mCarContextVolumeMax:");
                 dumpVolumes(writer, mCarContextVolumeMax);
-                writer.println("mCarContextVolumeMin:");
-                dumpVolumes(writer, mCarContextVolumeMin);
                 writer.println("Number of volume controllers:" +
                         mVolumeControllers.getRegisteredCallbackCount());
             }
diff --git a/service/src/com/android/car/CarVolumeService.java b/service/src/com/android/car/CarVolumeService.java
index 74e7071..786c791 100644
--- a/service/src/com/android/car/CarVolumeService.java
+++ b/service/src/com/android/car/CarVolumeService.java
@@ -17,12 +17,11 @@
 package com.android.car;
 
 import android.content.Context;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
 import android.media.AudioAttributes;
 import android.media.IVolumeController;
-import android.view.KeyEvent;
 
 import com.android.car.hal.AudioHalService;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
 
 import java.io.PrintWriter;
 
@@ -38,7 +37,7 @@
     private static final String TAG = "CarVolumeService";
 
     public static int DEFAULT_CAR_AUDIO_CONTEXT =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+            VehicleAudioContextFlag.MUSIC_FLAG;
     private final Context mContext;
     private final AudioHalService mAudioHal;
     private final CarAudioService mAudioService;
diff --git a/service/src/com/android/car/DrivingStatePolicy.java b/service/src/com/android/car/DrivingStatePolicy.java
index 4716c1e..2da7021 100644
--- a/service/src/com/android/car/DrivingStatePolicy.java
+++ b/service/src/com/android/car/DrivingStatePolicy.java
@@ -16,7 +16,6 @@
 
 package com.android.car;
 
-import android.car.Car;
 import android.car.hardware.CarSensorEvent;
 import android.car.hardware.CarSensorManager;
 import android.car.hardware.ICarSensorEventListener;
@@ -37,7 +36,7 @@
 
     private final Context mContext;
     private CarSensorService mSensorService;
-    private int mDringState = CarSensorEvent.DRIVE_STATUS_FULLY_RESTRICTED;
+    private int mDrivingState = CarSensorEvent.DRIVE_STATUS_FULLY_RESTRICTED;
     private SensorListener mSensorListener;
     private boolean mIsReady = false;
     private boolean mStarted = false;
@@ -54,8 +53,9 @@
         }
     };
 
-    public DrivingStatePolicy(Context context) {
+    public DrivingStatePolicy(Context context, CarSensorService sensorService) {
         mContext = context;
+        mSensorService = sensorService;
     }
 
     @Override
@@ -65,8 +65,6 @@
 
     @Override
     public synchronized void onSensorServiceReady() {
-        mSensorService =
-                (CarSensorService) ICarImpl.getInstance(mContext).getCarService(Car.SENSOR_SERVICE);
         int sensorList[] = mSensorService.getSupportedSensors();
         boolean hasSpeed = subscribeIfSupportedLocked(sensorList,
                 CarSensorManager.SENSOR_TYPE_CAR_SPEED, CarSensorManager.SENSOR_RATE_FASTEST);
@@ -118,7 +116,7 @@
     @Override
     public synchronized boolean requestSensorStart(int sensorType, int rate) {
         mStarted = true;
-        dispatchCarSensorEvent(mSensorListener, createEvent(mDringState));
+        dispatchCarSensorEvent(mSensorListener, createEvent(mDrivingState));
         return true;
     }
 
@@ -146,9 +144,9 @@
             case CarSensorManager.SENSOR_TYPE_GEAR:
             case CarSensorManager.SENSOR_TYPE_CAR_SPEED:
                 int drivingState = recalcDrivingStateLocked();
-                if (drivingState != mDringState && mSensorListener != null) {
-                    mDringState = drivingState;
-                    dispatchCarSensorEvent(mSensorListener, createEvent(mDringState));
+                if (drivingState != mDrivingState && mSensorListener != null) {
+                    mDrivingState = drivingState;
+                    dispatchCarSensorEvent(mSensorListener, createEvent(mDrivingState));
                 }
                 break;
             default:
diff --git a/service/src/com/android/car/ICarImpl.java b/service/src/com/android/car/ICarImpl.java
index b6386af..e05efaa 100644
--- a/service/src/com/android/car/ICarImpl.java
+++ b/service/src/com/android/car/ICarImpl.java
@@ -22,6 +22,7 @@
 import android.car.cluster.renderer.IInstrumentClusterNavigation;
 import android.content.Context;
 import android.content.pm.PackageManager;
+import android.hardware.vehicle.V2_0.IVehicle;
 import android.os.IBinder;
 import android.util.Log;
 
@@ -40,14 +41,16 @@
 
     // load jni for all services here
     static {
-        System.loadLibrary("jni_car_service");
+        try {
+            System.loadLibrary("jni_car_service");
+        } catch (UnsatisfiedLinkError ex) {
+            // Unable to load native library when loaded from the testing framework.
+            Log.e(CarLog.TAG_SERVICE, "Failed to load jni_car_service library: " + ex.getMessage());
+        }
     }
 
-    @GuardedBy("ICarImpl.class")
-    private static ICarImpl sInstance = null;
-
     private final Context mContext;
-    private final VehicleHal mHal;
+    private VehicleHal mHal;
 
     private final SystemActivityMonitoringService mSystemActivityMonitoringService;
     private final CarPowerManagementService mCarPowerManagementService;
@@ -68,54 +71,42 @@
     private final SystemStateControllerService mSystemStateControllerService;
     private final CarVendorExtensionService mCarVendorExtensionService;
 
+    private final CarServiceBase[] mAllServices;
+
     /** Test only service. Populate it only when necessary. */
     @GuardedBy("this")
     private CarTestService mCarTestService;
-    private final CarServiceBase[] mAllServices;
 
-    public synchronized static ICarImpl getInstance(Context serviceContext) {
-        if (sInstance == null) {
-            sInstance = new ICarImpl(serviceContext);
-            sInstance.init();
-        }
-        return sInstance;
-    }
-
-    public synchronized static void releaseInstance() {
-        if (sInstance == null) {
-            return;
-        }
-        sInstance.release();
-        sInstance = null;
-    }
-
-    public ICarImpl(Context serviceContext) {
+    public ICarImpl(Context serviceContext, IVehicle vehicle, SystemInterface systemInterface) {
         mContext = serviceContext;
-        mHal = VehicleHal.getInstance();
+        mHal = new VehicleHal(vehicle);
         mSystemActivityMonitoringService = new SystemActivityMonitoringService(serviceContext);
-        mCarPowerManagementService = new CarPowerManagementService(serviceContext);
-        mCarSensorService = new CarSensorService(serviceContext);
+        mCarPowerManagementService = new CarPowerManagementService(
+                mHal.getPowerHal(), systemInterface);
+        mCarSensorService = new CarSensorService(serviceContext, mHal.getSensorHal());
         mCarPackageManagerService = new CarPackageManagerService(serviceContext, mCarSensorService,
                 mSystemActivityMonitoringService);
-        mCarInputService = new CarInputService(serviceContext);
+        mCarInputService = new CarInputService(serviceContext, mHal.getInputHal());
         mCarProjectionService = new CarProjectionService(serviceContext, mCarInputService);
         mGarageModeService = new GarageModeService(mContext, mCarPowerManagementService);
-        mCarInfoService = new CarInfoService(serviceContext);
+        mCarInfoService = new CarInfoService(serviceContext, mHal.getInfoHal());
         mAppFocusService = new AppFocusService(serviceContext, mSystemActivityMonitoringService);
-        mCarAudioService = new CarAudioService(serviceContext, mCarInputService);
-        mCarCabinService = new CarCabinService(serviceContext);
-        mCarHvacService = new CarHvacService(serviceContext);
-        mCarRadioService = new CarRadioService(serviceContext);
+        mCarAudioService = new CarAudioService(serviceContext, mHal.getAudioHal(),
+                mCarInputService);
+        mCarCabinService = new CarCabinService(serviceContext, mHal.getCabinHal());
+        mCarHvacService = new CarHvacService(serviceContext, mHal.getHvacHal());
+        mCarRadioService = new CarRadioService(serviceContext, mHal.getRadioHal());
         mCarCameraService = new CarCameraService(serviceContext);
-        mCarNightService = new CarNightService(serviceContext);
+        mCarNightService = new CarNightService(serviceContext, mCarSensorService);
         mInstrumentClusterService = new InstrumentClusterService(serviceContext,
                 mAppFocusService, mCarInputService);
         mSystemStateControllerService = new SystemStateControllerService(serviceContext,
                 mCarPowerManagementService, mCarAudioService, this);
-        mCarVendorExtensionService = new CarVendorExtensionService(serviceContext);
+        mCarVendorExtensionService = new CarVendorExtensionService(serviceContext,
+                mHal.getVendorExtensionHal());
 
         // Be careful with order. Service depending on other service should be inited later.
-        mAllServices = new CarServiceBase[] {
+        mAllServices = new CarServiceBase[]{
                 mSystemActivityMonitoringService,
                 mCarPowerManagementService,
                 mCarSensorService,
@@ -134,43 +125,22 @@
                 mCarProjectionService,
                 mSystemStateControllerService,
                 mCarVendorExtensionService
-                };
+        };
     }
 
-    private void init() {
+    public void init() {
+        mHal.init();
         for (CarServiceBase service: mAllServices) {
             service.init();
         }
     }
 
-    private void release() {
+    public void release() {
         // release done in opposite order from init
         for (int i = mAllServices.length - 1; i >= 0; i--) {
             mAllServices[i].release();
         }
-        VehicleHal.releaseInstance();
-    }
-
-    /** Only for CarTestService */
-    void startMocking() {
-        reinitServices();
-    }
-
-    /** Only for CarTestService */
-    void stopMocking() {
-        reinitServices();
-    }
-
-    /** Reset all services when starting / stopping vehicle hal mocking */
-    private void reinitServices() {
-        for (int i = mAllServices.length - 1; i >= 0; i--) {
-            mAllServices[i].release();
-        }
-        VehicleHal.getInstance().release();
-        VehicleHal.getInstance().init();
-        for (CarServiceBase service: mAllServices) {
-            service.init();
-        }
+        mHal.release();
     }
 
     @Override
@@ -210,7 +180,7 @@
                 assertVendorExtensionPermission(mContext);
                 return mCarVendorExtensionService;
             case Car.TEST_SERVICE: {
-                assertVehicleHalMockPermission(mContext);
+                assertPermission(mContext, Car.PERMISSION_CAR_TEST_SERVICE);
                 synchronized (this) {
                     if (mCarTestService == null) {
                         mCarTestService = new CarTestService(mContext, this);
@@ -226,11 +196,7 @@
 
     @Override
     public int getCarConnectionType() {
-        if (!isInMocking()) {
-            return Car.CONNECTION_TYPE_EMBEDDED;
-        } else {
-            return Car.CONNECTION_TYPE_EMBEDDED_MOCKING;
-        }
+        return Car.CONNECTION_TYPE_EMBEDDED;
     }
 
     public CarServiceBase getCarInternalService(String serviceName) {
@@ -246,17 +212,6 @@
         }
     }
 
-    /**
-     * Whether mocking underlying HAL or not.
-     * @return
-     */
-    public synchronized boolean isInMocking() {
-        if (mCarTestService == null) {
-            return false;
-        }
-        return mCarTestService.isInMocking();
-    }
-
     public static void assertVehicleHalMockPermission(Context context) {
         assertPermission(context, Car.PERMISSION_MOCK_VEHICLE_HAL);
     }
@@ -300,10 +255,11 @@
         for (CarServiceBase service: mAllServices) {
             service.dump(writer);
         }
-        CarTestService testService = mCarTestService;
-        if (testService != null) {
-            testService.dump(writer);
+        if (mCarTestService != null) {
+            mCarTestService.dump(writer);
         }
+        writer.println("*Dump Vehicle HAL*");
+        mHal.dump(writer);
     }
 
     void execShellCmd(String[] args, PrintWriter writer) {
diff --git a/service/src/com/android/car/SystemInterface.java b/service/src/com/android/car/SystemInterface.java
new file mode 100644
index 0000000..6311d80
--- /dev/null
+++ b/service/src/com/android/car/SystemInterface.java
@@ -0,0 +1,191 @@
+/*
+ * 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.
+ */
+
+package com.android.car;
+
+import android.content.Context;
+import android.hardware.display.DisplayManager;
+import android.os.PowerManager;
+import android.os.PowerManager.WakeLock;
+import android.os.SystemClock;
+import android.util.Log;
+import android.view.Display;
+
+/**
+ * Interface to abstract all system interaction.
+ */
+public abstract class SystemInterface {
+    public abstract void setDisplayState(boolean on);
+    public abstract void releaseAllWakeLocks();
+    public abstract void shutdown();
+    public abstract void enterDeepSleep(int wakeupTimeSec);
+    public abstract void switchToPartialWakeLock();
+    public abstract void switchToFullWakeLock();
+    public abstract void startDisplayStateMonitoring(CarPowerManagementService service);
+    public abstract void stopDisplayStateMonitoring();
+    public abstract boolean isSystemSupportingDeepSleep();
+    public abstract boolean isWakeupCausedByTimer();
+
+
+    public static SystemInterface getDefault(Context context) {
+        return new SystemInterfaceImpl(context);
+    }
+
+    private static class SystemInterfaceImpl extends SystemInterface {
+        private final PowerManager mPowerManager;
+        private final DisplayManager mDisplayManager;
+        private final WakeLock mFullWakeLock;
+        private final WakeLock mPartialWakeLock;
+        private final DisplayStateListener mDisplayListener;
+        private CarPowerManagementService mService;
+        private boolean mDisplayStateSet;
+
+        private SystemInterfaceImpl(Context context) {
+            mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+            mDisplayManager = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
+            mFullWakeLock = mPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,
+                    CarLog.TAG_POWER);
+            mPartialWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,
+                    CarLog.TAG_POWER);
+            mDisplayListener = new DisplayStateListener();
+        }
+
+        @Override
+        public void startDisplayStateMonitoring(CarPowerManagementService service) {
+            synchronized (this) {
+                mService = service;
+                mDisplayStateSet = isMainDisplayOn();
+            }
+            mDisplayManager.registerDisplayListener(mDisplayListener, service.getHandler());
+        }
+
+        @Override
+        public void stopDisplayStateMonitoring() {
+            mDisplayManager.unregisterDisplayListener(mDisplayListener);
+        }
+
+        @Override
+        public void setDisplayState(boolean on) {
+            synchronized (this) {
+                mDisplayStateSet = on;
+            }
+            if (on) {
+                switchToFullWakeLock();
+                Log.i(CarLog.TAG_POWER, "on display");
+                mPowerManager.wakeUp(SystemClock.uptimeMillis());
+            } else {
+                switchToPartialWakeLock();
+                Log.i(CarLog.TAG_POWER, "off display");
+                mPowerManager.goToSleep(SystemClock.uptimeMillis());
+            }
+        }
+
+        private boolean isMainDisplayOn() {
+            Display disp = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY);
+            return disp.getState() == Display.STATE_ON;
+        }
+
+        @Override
+        public void shutdown() {
+            mPowerManager.shutdown(false /* no confirm*/, null, true /* true */);
+        }
+
+        @Override
+        public void enterDeepSleep(int wakeupTimeSec) {
+            //TODO set wake up time, bug: 32061842
+            mPowerManager.goToSleep(SystemClock.uptimeMillis(),
+                    PowerManager.GO_TO_SLEEP_REASON_DEVICE_ADMIN,
+                    PowerManager.GO_TO_SLEEP_FLAG_NO_DOZE);
+        }
+
+        @Override
+        public boolean isSystemSupportingDeepSleep() {
+            //TODO should return by checking some kernel suspend control sysfs, bug: 32061842
+            return false;
+        }
+
+        @Override
+        public void switchToPartialWakeLock() {
+            if (!mPartialWakeLock.isHeld()) {
+                mPartialWakeLock.acquire();
+            }
+            if (mFullWakeLock.isHeld()) {
+                mFullWakeLock.release();
+            }
+        }
+
+        @Override
+        public void switchToFullWakeLock() {
+            if (!mFullWakeLock.isHeld()) {
+                mFullWakeLock.acquire();
+            }
+            if (mPartialWakeLock.isHeld()) {
+                mPartialWakeLock.release();
+            }
+        }
+
+        @Override
+        public void releaseAllWakeLocks() {
+            if (mPartialWakeLock.isHeld()) {
+                mPartialWakeLock.release();
+            }
+            if (mFullWakeLock.isHeld()) {
+                mFullWakeLock.release();
+            }
+        }
+
+        @Override
+        public boolean isWakeupCausedByTimer() {
+            //TODO bug: 32061842, check wake up reason and do necessary operation information should
+            // come from kernel. it can be either power on or wake up for maintenance
+            // power on will involve GPIO trigger from power controller
+            // its own wakeup will involve timer expiration.
+            return false;
+        }
+
+        private void handleMainDisplayChanged() {
+            boolean isOn = isMainDisplayOn();
+            CarPowerManagementService service;
+            synchronized (this) {
+                if (mDisplayStateSet == isOn) { // same as what is set
+                    return;
+                }
+                service = mService;
+            }
+            service.handleMainDisplayChanged(isOn);
+        }
+
+        private class DisplayStateListener implements DisplayManager.DisplayListener {
+
+            @Override
+            public void onDisplayAdded(int displayId) {
+                //ignore
+            }
+
+            @Override
+            public void onDisplayChanged(int displayId) {
+                if (displayId == Display.DEFAULT_DISPLAY) {
+                    handleMainDisplayChanged();
+                }
+            }
+
+            @Override
+            public void onDisplayRemoved(int displayId) {
+                //ignore
+            }
+        }
+    }
+}
diff --git a/service/src/com/android/car/SystemStateControllerService.java b/service/src/com/android/car/SystemStateControllerService.java
index 5746300..63821c5 100644
--- a/service/src/com/android/car/SystemStateControllerService.java
+++ b/service/src/com/android/car/SystemStateControllerService.java
@@ -33,9 +33,9 @@
     private final boolean mLockWhenMuting;
 
     public SystemStateControllerService(Context context,
-            CarPowerManagementService carPowerManagementSercvice,
+            CarPowerManagementService carPowerManagementService,
             CarAudioService carAudioService, ICarImpl carImpl) {
-        mCarPowerManagementService = carPowerManagementSercvice;
+        mCarPowerManagementService = carPowerManagementService;
         mCarAudioService = carAudioService;
         mICarImpl = carImpl;
         Resources res = context.getResources();
@@ -51,16 +51,12 @@
     @Override
     public void onPowerOn(boolean displayOn) {
         if (displayOn) {
-            if (!mICarImpl.isInMocking()) {
-                Log.i(CarLog.TAG_SYS, "Media unmute");
-                mCarAudioService.unMuteMedia();
-            }
+            Log.i(CarLog.TAG_SYS, "Media unmute");
+            mCarAudioService.unMuteMedia();
         } else {
-            if (!mICarImpl.isInMocking()) { // do not do this in mocking as it can affect test.
-                Log.i(CarLog.TAG_SYS, "Media mute");
-                mCarAudioService.muteMediaWithLock(mLockWhenMuting);
-                //TODO store last context and resume or silence radio on display on. bug: 32096079
-            }
+            Log.i(CarLog.TAG_SYS, "Media mute");
+            mCarAudioService.muteMediaWithLock(mLockWhenMuting);
+            //TODO store last context and resume or silence radio on display on. bug: 32096079
         }
     }
 
diff --git a/service/src/com/android/car/VolumeUtils.java b/service/src/com/android/car/VolumeUtils.java
index fac3350..c2a1a7a 100644
--- a/service/src/com/android/car/VolumeUtils.java
+++ b/service/src/com/android/car/VolumeUtils.java
@@ -17,16 +17,13 @@
 package com.android.car;
 
 import android.car.settings.CarSettings;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
 import android.media.AudioAttributes;
 import android.media.AudioManager;
 import android.util.Log;
 import android.util.SparseArray;
 
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
 
 public class VolumeUtils {
     private static final String TAG = "VolumeUtils";
@@ -42,50 +39,50 @@
     };
 
     public static final int[] CAR_AUDIO_CONTEXT = {
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG,
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG
+            VehicleAudioContextFlag.MUSIC_FLAG,
+            VehicleAudioContextFlag.NAVIGATION_FLAG,
+            VehicleAudioContextFlag.VOICE_COMMAND_FLAG,
+            VehicleAudioContextFlag.CALL_FLAG,
+            VehicleAudioContextFlag.ALARM_FLAG,
+            VehicleAudioContextFlag.NOTIFICATION_FLAG,
+            VehicleAudioContextFlag.UNKNOWN_FLAG,
+            VehicleAudioContextFlag.SAFETY_ALERT_FLAG,
+            VehicleAudioContextFlag.CD_ROM_FLAG,
+            VehicleAudioContextFlag.AUX_AUDIO_FLAG,
+            VehicleAudioContextFlag.SYSTEM_SOUND_FLAG,
+            VehicleAudioContextFlag.RADIO_FLAG
     };
 
     public static final SparseArray<String> CAR_AUDIO_CONTEXT_SETTINGS = new SparseArray<>();
     static {
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.UNKNOWN_FLAG,
                 CarSettings.Global.KEY_VOLUME_MUSIC);
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.MUSIC_FLAG,
                 CarSettings.Global.KEY_VOLUME_MUSIC);
         CAR_AUDIO_CONTEXT_SETTINGS.put(
-                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG,
+                VehicleAudioContextFlag.NAVIGATION_FLAG,
                 CarSettings.Global.KEY_VOLUME_NAVIGATION);
         CAR_AUDIO_CONTEXT_SETTINGS.put(
-                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG,
+                VehicleAudioContextFlag.VOICE_COMMAND_FLAG,
                 CarSettings.Global.KEY_VOLUME_VOICE_COMMAND);
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.CALL_FLAG,
                 CarSettings.Global.KEY_VOLUME_CALL);
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.ALARM_FLAG,
                 CarSettings.Global.KEY_VOLUME_ALARM);
         CAR_AUDIO_CONTEXT_SETTINGS.put(
-                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG,
+                VehicleAudioContextFlag.NOTIFICATION_FLAG,
                 CarSettings.Global.KEY_VOLUME_NOTIFICATION);
         CAR_AUDIO_CONTEXT_SETTINGS.put(
-                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG,
+                VehicleAudioContextFlag.SAFETY_ALERT_FLAG,
                 CarSettings.Global.KEY_VOLUME_SAFETY_ALERT);
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.CD_ROM_FLAG,
                 CarSettings.Global.KEY_VOLUME_CD_ROM);
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.AUX_AUDIO_FLAG,
                 CarSettings.Global.KEY_VOLUME_AUX);
         CAR_AUDIO_CONTEXT_SETTINGS.put(
-                VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG,
+                VehicleAudioContextFlag.SYSTEM_SOUND_FLAG,
                 CarSettings.Global.KEY_VOLUME_SYSTEM_SOUND);
-        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG,
+        CAR_AUDIO_CONTEXT_SETTINGS.put(VehicleAudioContextFlag.RADIO_FLAG,
                 CarSettings.Global.KEY_VOLUME_RADIO);
     }
 
@@ -105,35 +102,35 @@
     public static int androidStreamToCarContext(int logicalAndroidStream) {
         switch (logicalAndroidStream) {
             case AudioManager.STREAM_VOICE_CALL:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
+                return VehicleAudioContextFlag.CALL_FLAG;
             case AudioManager.STREAM_SYSTEM:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+                return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
             case AudioManager.STREAM_RING:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+                return VehicleAudioContextFlag.NOTIFICATION_FLAG;
             case AudioManager.STREAM_MUSIC:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+                return VehicleAudioContextFlag.MUSIC_FLAG;
             case AudioManager.STREAM_ALARM:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
+                return VehicleAudioContextFlag.ALARM_FLAG;
             case AudioManager.STREAM_NOTIFICATION:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+                return VehicleAudioContextFlag.NOTIFICATION_FLAG;
             case AudioManager.STREAM_DTMF:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+                return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
             default:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
+                return VehicleAudioContextFlag.UNKNOWN_FLAG;
         }
     }
 
     public static int carContextToAndroidStream(int carContext) {
         switch (carContext) {
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG:
+            case VehicleAudioContextFlag.CALL_FLAG:
                 return AudioManager.STREAM_VOICE_CALL;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG:
+            case VehicleAudioContextFlag.SYSTEM_SOUND_FLAG:
                 return AudioManager.STREAM_SYSTEM;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG:
+            case VehicleAudioContextFlag.NOTIFICATION_FLAG:
                 return AudioManager.STREAM_NOTIFICATION;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG:
+            case VehicleAudioContextFlag.MUSIC_FLAG:
                 return AudioManager.STREAM_MUSIC;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG:
+            case VehicleAudioContextFlag.ALARM_FLAG:
                 return AudioManager.STREAM_ALARM;
             default:
                 return AudioManager.STREAM_MUSIC;
diff --git a/service/src/com/android/car/hal/AudioHalService.java b/service/src/com/android/car/hal/AudioHalService.java
index cb73454..b3f8880 100644
--- a/service/src/com/android/car/hal/AudioHalService.java
+++ b/service/src/com/android/car/hal/AudioHalService.java
@@ -15,95 +15,89 @@
  */
 package com.android.car.hal;
 
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_EXT_ROUTING_HINT;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_FOCUS;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_HW_VARIANT;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_ROUTING_POLICY;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_VOLUME;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AUDIO_VOLUME_LIMIT;
+import static com.android.car.CarServiceUtils.toIntArray;
+import static java.lang.Integer.toHexString;
+
+import android.annotation.Nullable;
 import android.car.VehicleZoneUtil;
 import android.car.media.CarAudioManager;
-import android.os.ServiceSpecificException;
+import android.hardware.vehicle.V2_0.VehicleAudioContextFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioExtFocusFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusRequest;
+import android.hardware.vehicle.V2_0.VehicleAudioFocusState;
+import android.hardware.vehicle.V2_0.VehicleAudioHwVariantConfigFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioRoutingPolicyIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeCapabilityFlag;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeIndex;
+import android.hardware.vehicle.V2_0.VehicleAudioVolumeLimitIndex;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.text.TextUtils;
 import android.util.Log;
-import android.util.Pair;
 
 import com.android.car.AudioRoutingPolicy;
 import com.android.car.CarAudioAttributesUtil;
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioContextFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioExtFocusFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusRequest;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioFocusState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioHwVariantConfigFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioRoutingPolicyIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStreamState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioStreamStateIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeCapabilityFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleAudioVolumeLimitIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 public class AudioHalService extends HalServiceBase {
     public static final int VEHICLE_AUDIO_FOCUS_REQUEST_INVALID = -1;
     public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN =
-            VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN;
+            VehicleAudioFocusRequest.REQUEST_GAIN;
     public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT =
-            VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT;
+            VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT;
     public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK =
-            VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_MAY_DUCK;
+            VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_MAY_DUCK;
     public static final int VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK =
-            VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_GAIN_TRANSIENT_NO_DUCK;
+            VehicleAudioFocusRequest.REQUEST_GAIN_TRANSIENT_NO_DUCK;
     public static final int VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE =
-            VehicleAudioFocusRequest.VEHICLE_AUDIO_FOCUS_REQUEST_RELEASE;
-
-    public static String audioFocusRequestToString(int request) {
-        return VehicleAudioFocusRequest.enumToString(request);
-    }
+            VehicleAudioFocusRequest.REQUEST_RELEASE;
 
     public static final int VEHICLE_AUDIO_FOCUS_STATE_INVALID = -1;
     public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN =
-            VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN;
+            VehicleAudioFocusState.STATE_GAIN;
     public static final int VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT =
-            VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_GAIN_TRANSIENT;
+            VehicleAudioFocusState.STATE_GAIN_TRANSIENT;
     public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK =
-            VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_CAN_DUCK;
+            VehicleAudioFocusState.STATE_LOSS_TRANSIENT_CAN_DUCK;
     public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT =
-            VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT;
+            VehicleAudioFocusState.STATE_LOSS_TRANSIENT;
     public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS =
-            VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS;
+            VehicleAudioFocusState.STATE_LOSS;
     public static final int VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE =
-            VehicleAudioFocusState.VEHICLE_AUDIO_FOCUS_STATE_LOSS_TRANSIENT_EXLCUSIVE;
+            VehicleAudioFocusState.STATE_LOSS_TRANSIENT_EXLCUSIVE;
 
-    public static String audioFocusStateToString(int state) {
-        return VehicleAudioFocusState.enumToString(state);
-    }
-
-    public static final int VEHICLE_AUDIO_STREAM_STATE_STOPPED =
-            VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STOPPED;
-    public static final int VEHICLE_AUDIO_STREAM_STATE_STARTED =
-            VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED;
-
-    public static String audioStreamStateToString(int state) {
-        return VehicleAudioStreamState.enumToString(state);
-    }
+    // TODO(pavelm): we don't have internal properties anymore
+//    public static final int VEHICLE_AUDIO_STREAM_STATE_STOPPED =
+//            VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STOPPED;
+//    public static final int VEHICLE_AUDIO_STREAM_STATE_STARTED =
+//            VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED;
 
     public static final int VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG =
-            VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_NONE_FLAG;
+            VehicleAudioExtFocusFlag.NONE_FLAG;
     public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG =
-            VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PERMANENT_FLAG;
+            VehicleAudioExtFocusFlag.PERMANENT_FLAG;
     public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG =
-            VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_TRANSIENT_FLAG;
+            VehicleAudioExtFocusFlag.TRANSIENT_FLAG;
     public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG =
-            VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_PLAY_ONLY_FLAG;
+            VehicleAudioExtFocusFlag.PLAY_ONLY_FLAG;
     public static final int VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG =
-            VehicleAudioExtFocusFlag.VEHICLE_AUDIO_EXT_FOCUS_CAR_MUTE_MEDIA_FLAG;
+            VehicleAudioExtFocusFlag.MUTE_MEDIA_FLAG;
 
     public static final int STREAM_NUM_DEFAULT = 0;
 
@@ -112,31 +106,31 @@
     public static final int FOCUS_STATE_ARRAY_INDEX_EXTERNAL_FOCUS = 2;
 
     public static final int AUDIO_CONTEXT_MUSIC_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+            VehicleAudioContextFlag.MUSIC_FLAG;
     public static final int AUDIO_CONTEXT_NAVIGATION_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG;
+            VehicleAudioContextFlag.NAVIGATION_FLAG;
     public static final int AUDIO_CONTEXT_VOICE_COMMAND_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG;
+            VehicleAudioContextFlag.VOICE_COMMAND_FLAG;
     public static final int AUDIO_CONTEXT_CALL_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
+            VehicleAudioContextFlag.CALL_FLAG;
     public static final int AUDIO_CONTEXT_ALARM_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
+            VehicleAudioContextFlag.ALARM_FLAG;
     public static final int AUDIO_CONTEXT_NOTIFICATION_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+            VehicleAudioContextFlag.NOTIFICATION_FLAG;
     public static final int AUDIO_CONTEXT_UNKNOWN_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
+            VehicleAudioContextFlag.UNKNOWN_FLAG;
     public static final int AUDIO_CONTEXT_SAFETY_ALERT_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG;
+            VehicleAudioContextFlag.SAFETY_ALERT_FLAG;
     public static final int AUDIO_CONTEXT_RADIO_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+            VehicleAudioContextFlag.RADIO_FLAG;
     public static final int AUDIO_CONTEXT_CD_ROM_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG;
+            VehicleAudioContextFlag.CD_ROM_FLAG;
     public static final int AUDIO_CONTEXT_AUX_AUDIO_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG;
+            VehicleAudioContextFlag.AUX_AUDIO_FLAG;
     public static final int AUDIO_CONTEXT_SYSTEM_SOUND_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+            VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
     public static final int AUDIO_CONTEXT_EXT_SOURCE_FLAG =
-            VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG;
+            VehicleAudioContextFlag.EXT_SOURCE_FLAG;
 
     public interface AudioHalFocusListener {
         /**
@@ -193,60 +187,54 @@
     }
 
     public void setAudioRoutingPolicy(AudioRoutingPolicy policy) {
-        VehicleNetwork vn = mVehicleHal.getVehicleNetwork();
-        VehiclePropConfigs configs = vn.listProperties(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY);
-        if (configs == null) {
+        if (!mVehicleHal.isPropertySupported(VehicleProperty.AUDIO_ROUTING_POLICY)) {
             Log.w(CarLog.TAG_AUDIO,
-                    "Vehicle HAL did not implement VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY");
+                    "Vehicle HAL did not implement VehicleProperty.AUDIO_ROUTING_POLICY");
             return;
         }
         int[] policyToSet = new int[2];
         for (int i = 0; i < policy.getPhysicalStreamsCount(); i++) {
-            policyToSet[VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_STREAM] =
-                    i;
+            policyToSet[VehicleAudioRoutingPolicyIndex.STREAM] = i;
             int contexts = 0;
             for (int logicalStream : policy.getLogicalStreamsForPhysicalStream(i)) {
                 contexts |= logicalStreamToHalContextType(logicalStream);
             }
-            policyToSet[VehicleAudioRoutingPolicyIndex.VEHICLE_AUDIO_ROUTING_POLICY_INDEX_CONTEXTS]
-                    = contexts;
+            policyToSet[VehicleAudioRoutingPolicyIndex.CONTEXTS] = contexts;
             try {
-                vn.setIntVectorProperty(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY,
-                        policyToSet);
-            } catch (ServiceSpecificException e) {
-                Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_ROUTING_POLICY", e);
+                mVehicleHal.set(AUDIO_ROUTING_POLICY).to(policyToSet);
+            } catch (PropertyTimeoutException e) {
+                Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_ROUTING_POLICY", e);
             }
         }
     }
 
     /**
-     * Returns the volume limits of a stream in the form <min, max>.
+     * Returns the volume limits of a stream. Returns null if max value wasn't defined for
+     * AUDIO_VOLUME property.
      */
-    public synchronized Pair<Integer, Integer> getStreamVolumeLimit(int stream) {
-        if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
-            throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+    @Nullable
+    public synchronized Integer getStreamMaxVolume(int stream) {
+        VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_VOLUME);
+        if (config == null) {
+            throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
         }
         int supportedContext = getSupportedAudioVolumeContexts();
-        VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
-        List<Integer> maxs = config.getInt32MaxsList();
-        List<Integer> mins = config.getInt32MinsList();
 
-        if (maxs.size() != mins.size()) {
-            Log.e(CarLog.TAG_AUDIO, "Invalid volume prop config");
-            return null;
+        int MAX_VALUES_FIRST_ELEMENT_INDEX = 4;
+        ArrayList<Integer> maxValues = new ArrayList<>();
+        for (int i = MAX_VALUES_FIRST_ELEMENT_INDEX; i < config.configArray.size(); i++) {
+            maxValues.add(config.configArray.get(i));
         }
 
-        Pair<Integer, Integer> result = null;
+        Integer result = null;
         if (supportedContext != 0) {
             int index = VehicleZoneUtil.zoneToIndex(supportedContext, stream);
-            if (index < maxs.size()) {
-                result = new Pair<>(mins.get(index), maxs.get(index));
+            if (index < maxValues.size()) {
+                result = maxValues.get(index);
             }
         } else {
-            if (stream < maxs.size()) {
-                result = new Pair<>(mins.get(stream), maxs.get(stream));
+            if (stream < maxValues.size()) {
+                result = maxValues.get(stream);
             }
         }
 
@@ -268,25 +256,25 @@
     public static int logicalStreamWithExtTypeToHalContextType(int logicalStream, String extType) {
         switch (logicalStream) {
             case CarAudioManager.CAR_AUDIO_USAGE_RADIO:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+                return VehicleAudioContextFlag.RADIO_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG;
+                return VehicleAudioContextFlag.CALL_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_MUSIC:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG;
+                return VehicleAudioContextFlag.MUSIC_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG;
+                return VehicleAudioContextFlag.NAVIGATION_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG;
+                return VehicleAudioContextFlag.VOICE_COMMAND_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_ALARM:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG;
+                return VehicleAudioContextFlag.ALARM_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG;
+                return VehicleAudioContextFlag.NOTIFICATION_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG;
+                return VehicleAudioContextFlag.SAFETY_ALERT_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG;
+                return VehicleAudioContextFlag.SYSTEM_SOUND_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_DEFAULT:
-                return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG;
+                return VehicleAudioContextFlag.UNKNOWN_FLAG;
             case CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE:
                 if (extType != null) {
                     switch (extType) {
@@ -297,13 +285,13 @@
                         return AudioHalService.AUDIO_CONTEXT_AUX_AUDIO_FLAG;
                     default:
                         if (extType.startsWith("RADIO_")) {
-                            return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+                            return VehicleAudioContextFlag.RADIO_FLAG;
                         } else {
                             return AudioHalService.AUDIO_CONTEXT_EXT_SOURCE_FLAG;
                         }
                     }
                 } else { // no external source specified. fall back to radio
-                    return VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG;
+                    return VehicleAudioContextFlag.RADIO_FLAG;
                 }
             case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_BOTTOM:
             case CarAudioAttributesUtil.CAR_AUDIO_USAGE_CARSERVICE_CAR_PROXY:
@@ -321,31 +309,31 @@
      */
     public static int carContextToCarUsage(int carContext) {
         switch (carContext) {
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_MUSIC_FLAG:
+            case VehicleAudioContextFlag.MUSIC_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_MUSIC;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NAVIGATION_FLAG:
+            case VehicleAudioContextFlag.NAVIGATION_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_NAVIGATION_GUIDANCE;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_ALARM_FLAG:
+            case VehicleAudioContextFlag.ALARM_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_ALARM;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_VOICE_COMMAND_FLAG:
+            case VehicleAudioContextFlag.VOICE_COMMAND_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_COMMAND;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_AUX_AUDIO_FLAG:
+            case VehicleAudioContextFlag.AUX_AUDIO_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CALL_FLAG:
+            case VehicleAudioContextFlag.CALL_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_VOICE_CALL;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_CD_ROM_FLAG:
+            case VehicleAudioContextFlag.CD_ROM_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_NOTIFICATION_FLAG:
+            case VehicleAudioContextFlag.NOTIFICATION_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_NOTIFICATION;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_RADIO_FLAG:
+            case VehicleAudioContextFlag.RADIO_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_RADIO;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SAFETY_ALERT_FLAG:
+            case VehicleAudioContextFlag.SAFETY_ALERT_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SAFETY_ALERT;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_SYSTEM_SOUND_FLAG:
+            case VehicleAudioContextFlag.SYSTEM_SOUND_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_SYSTEM_SOUND;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_UNKNOWN_FLAG:
+            case VehicleAudioContextFlag.UNKNOWN_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_DEFAULT;
-            case VehicleAudioContextFlag.VEHICLE_AUDIO_CONTEXT_EXT_SOURCE_FLAG:
+            case VehicleAudioContextFlag.EXT_SOURCE_FLAG:
                 return CarAudioManager.CAR_AUDIO_USAGE_EXTERNAL_AUDIO_SOURCE;
             default:
                 Log.w(CarLog.TAG_AUDIO, "Unknown car context:" + carContext);
@@ -360,10 +348,9 @@
     public void requestAudioFocusChange(int request, int streams, int extFocus, int audioContexts) {
         int[] payload = { request, streams, extFocus, audioContexts };
         try {
-            mVehicleHal.getVehicleNetwork().setIntVectorProperty(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS, payload);
-        } catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_FOCUS", e);
+            mVehicleHal.set(AUDIO_FOCUS).to(payload);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_FOCUS", e);
             // focus timeout will reset it anyway
         }
     }
@@ -371,36 +358,35 @@
     public void setStreamVolume(int streamType, int index) {
         int[] payload = {streamType, index, 0};
         try {
-            mVehicleHal.getVehicleNetwork().setIntVectorProperty(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, payload);
-        } catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_VOLUME", e);
+            mVehicleHal.set(VehicleProperty.AUDIO_VOLUME).to(payload);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_VOLUME", e);
             //TODO should reset volume, bug: 32096870
         }
     }
 
     public int getStreamVolume(int stream) {
         int[] volume = {stream, 0, 0};
-        VehiclePropValue streamVolume =
-                VehiclePropValueUtil.createIntVectorValue(
-                        VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME, volume, 0);
-        VehiclePropValue value;
+        VehiclePropValue requestedStreamVolume = new VehiclePropValue();
+        requestedStreamVolume.prop = VehicleProperty.AUDIO_VOLUME;
+        requestedStreamVolume.value.int32Values.addAll(Arrays.asList(stream, 0 , 0));
+        VehiclePropValue propValue;
         try {
-            value = mVehicleHal.getVehicleNetwork().getProperty(streamVolume);
-        }  catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_AUDIO, "AUDIO_VOLUME not ready", e);
+            propValue = mVehicleHal.get(requestedStreamVolume);
+        }  catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_VOLUME not ready", e);
             return 0;
         }
 
-        if (value.getInt32ValuesCount() != 3) {
+        if (propValue.value.int32Values.size() != 3) {
             Log.e(CarLog.TAG_AUDIO, "returned value not valid");
             throw new IllegalStateException("Invalid preset returned from service: "
-                    + value.getInt32ValuesList());
+                    + Arrays.toString(propValue.value.int32Values.toArray()));
         }
 
-        int retStreamNum = value.getInt32Values(0);
-        int retVolume = value.getInt32Values(1);
-        int retVolumeState = value.getInt32Values(2);
+        int retStreamNum = propValue.value.int32Values.get(0);
+        int retVolume = propValue.value.int32Values.get(1);
+        int retVolumeState = propValue.value.int32Values.get(2);
 
         if (retStreamNum != stream) {
             Log.e(CarLog.TAG_AUDIO, "Stream number is not the same: "
@@ -415,31 +401,28 @@
     }
 
     public synchronized boolean isRadioExternal() {
-        VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
+        VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_HW_VARIANT);
         if (config == null) {
             return true;
         }
-        return (config.getConfigArray(0) &
-                VehicleAudioHwVariantConfigFlag.VEHICLE_AUDIO_HW_VARIANT_FLAG_INTERNAL_RADIO_FLAG)
-                == 0;
+        return (config.configArray.get(0)
+                & VehicleAudioHwVariantConfigFlag.INTERNAL_RADIO_FLAG) == 0;
     }
 
     public synchronized boolean isFocusSupported() {
-        return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS);
+        return isPropertySupportedLocked(AUDIO_FOCUS);
     }
 
     public synchronized boolean isAudioVolumeSupported() {
-        return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
+        return isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME);
     }
 
     public synchronized int getSupportedAudioVolumeContexts() {
-        if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
-            throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+        if (!isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME)) {
+            throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
         }
-        VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
-        return config.getConfigArray(0);
+        VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_VOLUME);
+        return config.configArray.get(0);
     }
 
     /**
@@ -447,34 +430,32 @@
      * @return
      */
     public synchronized boolean isExternalAudioVolumePersistent() {
-        if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
-            throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+        if (!isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME)) {
+            throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
         }
-        VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
-        if (config.getConfigArray(0) == 0) { // physical streams only
+        VehiclePropConfig config = mProperties.get(VehicleProperty.AUDIO_VOLUME);
+        if (config.configArray.get(0) == 0) { // physical streams only
             return false;
         }
-        if ((config.getConfigArray(1) &
-                VehicleAudioVolumeCapabilityFlag.VEHICLE_AUDIO_VOLUME_CAPABILITY_PERSISTENT_STORAGE)
-                != 0) {
+        if ((config.configArray.get(1)
+                & VehicleAudioVolumeCapabilityFlag.PERSISTENT_STORAGE) != 0) {
             return true;
         }
         return false;
     }
 
     public synchronized boolean isAudioVolumeLimitSupported() {
-        return isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT);
+        return isPropertySupportedLocked(AUDIO_VOLUME_LIMIT);
     }
 
     public synchronized boolean isAudioVolumeMasterOnly() {
-        if (!isPropertySupportedLocked(VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME)) {
-            throw new IllegalStateException("VEHICLE_PROPERTY_AUDIO_VOLUME not supported");
+        if (!isPropertySupportedLocked(VehicleProperty.AUDIO_VOLUME)) {
+            throw new IllegalStateException("VehicleProperty.AUDIO_VOLUME not supported");
         }
         VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME);
-        if ((config.getConfigArray(1) &
-                VehicleAudioVolumeCapabilityFlag.VEHICLE_AUDIO_VOLUME_CAPABILITY_MASTER_VOLUME_ONLY)
+                AUDIO_VOLUME);
+        if ((config.configArray.get(1) &
+                VehicleAudioVolumeCapabilityFlag.MASTER_VOLUME_ONLY)
                 != 0) {
             return true;
         }
@@ -490,10 +471,10 @@
             return new int[] { VEHICLE_AUDIO_FOCUS_STATE_GAIN, 0xffffffff, 0};
         }
         try {
-            return mVehicleHal.getVehicleNetwork().getIntVectorProperty(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS);
-        } catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_AUDIO, "VEHICLE_PROPERTY_AUDIO_HW_VARIANT not ready", e);
+            VehiclePropValue propValue = mVehicleHal.get(VehicleProperty.AUDIO_FOCUS);
+            return toIntArray(propValue.value.int32Values);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_HW_VARIANT not ready", e);
             return new int[] { VEHICLE_AUDIO_FOCUS_STATE_LOSS, 0x0, 0};
         }
     }
@@ -518,7 +499,7 @@
 
         @Override
         public String toString() {
-            return "[bitPosition=" + bitPosition + ", physycalStreamNumber="
+            return "[bitPosition=" + bitPosition + ", physicalStreamNumber="
                     + physicalStreamNumber + "]";
         }
     }
@@ -531,21 +512,22 @@
     public Map<String, ExtRoutingSourceInfo> getExternalAudioRoutingTypes() {
         VehiclePropConfig config;
         synchronized (this) {
-            if (!isPropertySupportedLocked(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT)) {
+            if (!isPropertySupportedLocked(AUDIO_EXT_ROUTING_HINT)) {
+                if (DBG) {
+                    Log.i(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT is not supported");
+                }
                 return null;
             }
-            config = mProperties.get(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT);
+            config = mProperties.get(AUDIO_EXT_ROUTING_HINT);
         }
-        if (!config.hasConfigString()) {
-            Log.w(CarLog.TAG_HAL, "AUDIO_EXT_ROUTING_HINT with empty config string");
+        if (TextUtils.isEmpty(config.configString)) {
+            Log.w(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT with empty config string");
             return null;
         }
         Map<String, ExtRoutingSourceInfo> routingTypes = new HashMap<>();
-        String configString = config.getConfigString();
+        String configString = config.configString;
         if (DBG) {
-            Log.i(CarLog.TAG_HAL, "AUDIO_EXT_ROUTING_HINT config string:" + configString);
+            Log.i(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT config string:" + configString);
         }
         String[] routes = configString.split(",");
         for (String routeString : routes) {
@@ -561,7 +543,7 @@
                 name = tokens[1];
                 physicalStreamNumber = Integer.parseInt(tokens[2]);
             } else {
-                Log.w(CarLog.TAG_AUDIO, "VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT has wrong entry:" +
+                Log.w(CarLog.TAG_AUDIO, "AUDIO_EXT_ROUTING_HINT has wrong entry:" +
                         routeString);
                 continue;
             }
@@ -572,10 +554,9 @@
 
     public void setExternalRoutingSource(int[] externalRoutings) {
         try {
-            mVehicleHal.getVehicleNetwork().setIntVectorProperty(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT, externalRoutings);
-        } catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_AUDIO, "Cannot write to VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT", e);
+            mVehicleHal.set(AUDIO_EXT_ROUTING_HINT).to(externalRoutings);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_AUDIO, "Cannot write to VehicleProperty.AUDIO_EXT_ROUTING_HINT", e);
         }
     }
 
@@ -588,17 +569,16 @@
     public synchronized void init() {
         for (VehiclePropConfig config : mProperties.values()) {
             if (VehicleHal.isPropertySubscribable(config)) {
-                mVehicleHal.subscribeProperty(this, config.getProp(), 0);
+                mVehicleHal.subscribeProperty(this, config.prop, 0);
             }
         }
         try {
-            mVariant = mVehicleHal.getVehicleNetwork().getIntProperty(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT);
+            mVariant = mVehicleHal.get(int.class, AUDIO_HW_VARIANT);
         } catch (IllegalArgumentException e) {
             // no variant. Set to default, 0.
             mVariant = 0;
-        } catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_AUDIO, "VEHICLE_PROPERTY_AUDIO_HW_VARIANT not ready", e);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_AUDIO, "VehicleProperty.AUDIO_HW_VARIANT not ready", e);
             mVariant = 0;
         }
     }
@@ -607,34 +587,35 @@
     public synchronized void release() {
         for (VehiclePropConfig config : mProperties.values()) {
             if (VehicleHal.isPropertySubscribable(config)) {
-                mVehicleHal.unsubscribeProperty(this, config.getProp());
+                mVehicleHal.unsubscribeProperty(this, config.prop);
             }
         }
         mProperties.clear();
     }
 
     @Override
-    public synchronized List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties) {
+    public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
         for (VehiclePropConfig p : allProperties) {
-            switch (p.getProp()) {
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS:
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME:
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT:
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_HW_VARIANT:
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_EXT_ROUTING_HINT:
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE:
-                    mProperties.put(p.getProp(), p);
+            switch (p.prop) {
+                case VehicleProperty.AUDIO_FOCUS:
+                case VehicleProperty.AUDIO_VOLUME:
+                case VehicleProperty.AUDIO_VOLUME_LIMIT:
+                case VehicleProperty.AUDIO_HW_VARIANT:
+                case VehicleProperty.AUDIO_EXT_ROUTING_HINT:
+                    // TODO(pavelm): we don't have internal properties anymore.
+//                case VehicleProperty.INTERNAL_AUDIO_STREAM_STATE:
+                    mProperties.put(p.prop, p);
                     break;
             }
         }
-        return new LinkedList<VehiclePropConfig>(mProperties.values());
+        return new ArrayList<>(mProperties.values());
     }
 
     @Override
     public void handleHalEvents(List<VehiclePropValue> values) {
-        AudioHalFocusListener focusListener = null;
-        AudioHalVolumeListener volumeListener = null;
+        AudioHalFocusListener focusListener;
+        AudioHalVolumeListener volumeListener;
         synchronized (this) {
             focusListener = mFocusListener;
             volumeListener = mVolumeListener;
@@ -646,44 +627,38 @@
             AudioHalVolumeListener volumeListener,
             List<VehiclePropValue> values) {
         for (VehiclePropValue v : values) {
-            switch (v.getProp()) {
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_FOCUS: {
-                    int focusState = v.getInt32Values(
-                            VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_FOCUS);
-                    int streams = v.getInt32Values(
-                            VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_STREAMS);
-                    int externalFocus = v.getInt32Values(
-                            VehicleAudioFocusIndex.VEHICLE_AUDIO_FOCUS_INDEX_EXTERNAL_FOCUS_STATE);
+            ArrayList<Integer> vec = v.value.int32Values;
+            switch (v.prop) {
+                case VehicleProperty.AUDIO_FOCUS: {
+                    int focusState = vec.get(VehicleAudioFocusIndex.FOCUS);
+                    int streams = vec.get(VehicleAudioFocusIndex.STREAMS);
+                    int externalFocus = vec.get(VehicleAudioFocusIndex.EXTERNAL_FOCUS_STATE);
                     if (focusListener != null) {
                         focusListener.onFocusChange(focusState, streams, externalFocus);
                     }
                 } break;
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_INTERNAL_AUDIO_STREAM_STATE: {
-                    int state = v.getInt32Values(
-                            VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE);
-                    int streamNum = v.getInt32Values(
-                            VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM);
-                    if (focusListener != null) {
-                        focusListener.onStreamStatusChange(streamNum, state ==
-                                VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED);
-                    }
-                } break;
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME: {
-                    int volume = v.getInt32Values(
-                            VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_VOLUME);
-                    int streamNum = v.getInt32Values(
-                            VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STREAM);
-                    int volumeState = v.getInt32Values(
-                            VehicleAudioVolumeIndex.VEHICLE_AUDIO_VOLUME_INDEX_STATE);
+                // TODO(pavelm): we don't have internal properties anymore
+//                case INTERNAL_AUDIO_STREAM_STATE: {
+//                    int state = v.getInt32Values(
+//                            VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STATE);
+//                    int streamNum = v.getInt32Values(
+//                            VehicleAudioStreamStateIndex.VEHICLE_AUDIO_STREAM_STATE_INDEX_STREAM);
+//                    if (focusListener != null) {
+//                        focusListener.onStreamStatusChange(streamNum, state ==
+//                                VehicleAudioStreamState.VEHICLE_AUDIO_STREAM_STATE_STARTED);
+//                    }
+//                } break;
+                case AUDIO_VOLUME: {
+                    int volume = vec.get(VehicleAudioVolumeIndex.INDEX_VOLUME);
+                    int streamNum = vec.get(VehicleAudioVolumeIndex.INDEX_STREAM);
+                    int volumeState = vec.get(VehicleAudioVolumeIndex.INDEX_STATE);
                     if (volumeListener != null) {
                         volumeListener.onVolumeChange(streamNum, volume, volumeState);
                     }
                 } break;
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AUDIO_VOLUME_LIMIT: {
-                    int stream = v.getInt32Values(
-                            VehicleAudioVolumeLimitIndex.VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_STREAM);
-                    int maxVolume = v.getInt32Values(
-                            VehicleAudioVolumeLimitIndex.VEHICLE_AUDIO_VOLUME_LIMIT_INDEX_MAX_VOLUME);
+                case AUDIO_VOLUME_LIMIT: {
+                    int stream = vec.get(VehicleAudioVolumeLimitIndex.STREAM);
+                    int maxVolume = vec.get(VehicleAudioVolumeLimitIndex.MAX_VOLUME);
                     if (volumeListener != null) {
                         volumeListener.onVolumeLimitChange(stream, maxVolume);
                     }
diff --git a/service/src/com/android/car/hal/CabinHalService.java b/service/src/com/android/car/hal/CabinHalService.java
index 213f458..b0e5e21 100644
--- a/service/src/com/android/car/hal/CabinHalService.java
+++ b/service/src/com/android/car/hal/CabinHalService.java
@@ -16,8 +16,7 @@
 package com.android.car.hal;
 
 import android.car.hardware.cabin.CarCabinManager;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
+import android.hardware.vehicle.V2_0.VehicleProperty;
 
 public class CabinHalService extends PropertyHalServiceBase {
     private static final boolean DBG = false;
@@ -25,127 +24,127 @@
 
     private final ManagerToHalPropIdMap mMgrHalPropIdMap = ManagerToHalPropIdMap.create(new int[] {
             CarCabinManager.ID_DOOR_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_POS,
+            VehicleProperty.DOOR_POS,
 
             CarCabinManager.ID_DOOR_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_MOVE,
+            VehicleProperty.DOOR_MOVE,
 
             CarCabinManager.ID_DOOR_LOCK,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_DOOR_LOCK,
+            VehicleProperty.DOOR_LOCK,
 
             CarCabinManager.ID_MIRROR_Z_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Z_POS,
+            VehicleProperty.MIRROR_Z_POS,
 
             CarCabinManager.ID_MIRROR_Z_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Z_MOVE,
+            VehicleProperty.MIRROR_Z_MOVE,
 
             CarCabinManager.ID_MIRROR_Y_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Y_POS,
+            VehicleProperty.MIRROR_Y_POS,
 
             CarCabinManager.ID_MIRROR_Y_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_Y_MOVE,
+            VehicleProperty.MIRROR_Y_MOVE,
 
             CarCabinManager.ID_MIRROR_LOCK,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_LOCK,
+            VehicleProperty.MIRROR_LOCK,
 
             CarCabinManager.ID_MIRROR_FOLD,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_MIRROR_FOLD,
+            VehicleProperty.MIRROR_FOLD,
 
             CarCabinManager.ID_SEAT_MEMORY_SELECT,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_MEMORY_SELECT,
+            VehicleProperty.SEAT_MEMORY_SELECT,
 
             CarCabinManager.ID_SEAT_MEMORY_SET,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_MEMORY_SET,
+            VehicleProperty.SEAT_MEMORY_SET,
 
             CarCabinManager.ID_SEAT_BELT_BUCKLED,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BELT_BUCKLED,
+            VehicleProperty.SEAT_BELT_BUCKLED,
 
             CarCabinManager.ID_SEAT_BELT_HEIGHT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_POS,
+            VehicleProperty.SEAT_BELT_HEIGHT_POS,
 
             CarCabinManager.ID_SEAT_BELT_HEIGHT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BELT_HEIGHT_MOVE,
+            VehicleProperty.SEAT_BELT_HEIGHT_MOVE,
 
             CarCabinManager.ID_SEAT_FORE_AFT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_FORE_AFT_POS,
+            VehicleProperty.SEAT_FORE_AFT_POS,
 
             CarCabinManager.ID_SEAT_FORE_AFT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_FORE_AFT_MOVE,
+            VehicleProperty.SEAT_FORE_AFT_MOVE,
 
             CarCabinManager.ID_SEAT_BACKREST_ANGLE_1_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_POS,
+            VehicleProperty.SEAT_BACKREST_ANGLE_1_POS,
 
             CarCabinManager.ID_SEAT_BACKREST_ANGLE_1_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_1_MOVE,
+            VehicleProperty.SEAT_BACKREST_ANGLE_1_MOVE,
 
             CarCabinManager.ID_SEAT_BACKREST_ANGLE_2_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_POS,
+            VehicleProperty.SEAT_BACKREST_ANGLE_2_POS,
 
             CarCabinManager.ID_SEAT_BACKREST_ANGLE_2_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_BACKREST_ANGLE_2_MOVE,
+            VehicleProperty.SEAT_BACKREST_ANGLE_2_MOVE,
 
             CarCabinManager.ID_SEAT_HEIGHT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEIGHT_POS,
+            VehicleProperty.SEAT_HEIGHT_POS,
 
             CarCabinManager.ID_SEAT_HEIGHT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEIGHT_MOVE,
+            VehicleProperty.SEAT_HEIGHT_MOVE,
 
             CarCabinManager.ID_SEAT_DEPTH_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_DEPTH_POS,
+            VehicleProperty.SEAT_DEPTH_POS,
 
             CarCabinManager.ID_SEAT_DEPTH_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_DEPTH_MOVE,
+            VehicleProperty.SEAT_DEPTH_MOVE,
 
             CarCabinManager.ID_SEAT_TILT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_TILT_POS,
+            VehicleProperty.SEAT_TILT_POS,
 
             CarCabinManager.ID_SEAT_TILT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_TILT_MOVE,
+            VehicleProperty.SEAT_TILT_MOVE,
 
             CarCabinManager.ID_SEAT_LUMBAR_FORE_AFT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_POS,
+            VehicleProperty.SEAT_LUMBAR_FORE_AFT_POS,
 
             CarCabinManager.ID_SEAT_LUMBAR_FORE_AFT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_FORE_AFT_MOVE,
+            VehicleProperty.SEAT_LUMBAR_FORE_AFT_MOVE,
 
             CarCabinManager.ID_SEAT_LUMBAR_SIDE_SUPPORT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_POS,
+            VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_POS,
 
             CarCabinManager.ID_SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
+            VehicleProperty.SEAT_LUMBAR_SIDE_SUPPORT_MOVE,
 
             CarCabinManager.ID_SEAT_HEADREST_HEIGHT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_POS,
+            VehicleProperty.SEAT_HEADREST_HEIGHT_POS,
 
             CarCabinManager.ID_SEAT_HEADREST_HEIGHT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_HEIGHT_MOVE,
+            VehicleProperty.SEAT_HEADREST_HEIGHT_MOVE,
 
             CarCabinManager.ID_SEAT_HEADREST_ANGLE_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_POS,
+            VehicleProperty.SEAT_HEADREST_ANGLE_POS,
 
             CarCabinManager.ID_SEAT_HEADREST_ANGLE_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_ANGLE_MOVE,
+            VehicleProperty.SEAT_HEADREST_ANGLE_MOVE,
 
             CarCabinManager.ID_SEAT_HEADREST_FORE_AFT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_POS,
+            VehicleProperty.SEAT_HEADREST_FORE_AFT_POS,
 
             CarCabinManager.ID_SEAT_HEADREST_FORE_AFT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_SEAT_HEADREST_FORE_AFT_MOVE,
+            VehicleProperty.SEAT_HEADREST_FORE_AFT_MOVE,
 
             CarCabinManager.ID_WINDOW_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_POS,
+            VehicleProperty.WINDOW_POS,
 
             CarCabinManager.ID_WINDOW_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_MOVE,
+            VehicleProperty.WINDOW_MOVE,
 
             CarCabinManager.ID_WINDOW_VENT_POS,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_VENT_POS,
+            VehicleProperty.WINDOW_VENT_POS,
 
             CarCabinManager.ID_WINDOW_VENT_MOVE,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_VENT_MOVE,
+            VehicleProperty.WINDOW_VENT_MOVE,
 
             CarCabinManager.ID_WINDOW_LOCK,
-            VehicleNetworkConsts.VEHICLE_PROPERTY_WINDOW_LOCK
+            VehicleProperty.WINDOW_LOCK
     });
 
     public CabinHalService(VehicleHal vehicleHal) {
diff --git a/service/src/com/android/car/hal/CarPropertyUtils.java b/service/src/com/android/car/hal/CarPropertyUtils.java
index c584f31..00cde28 100644
--- a/service/src/com/android/car/hal/CarPropertyUtils.java
+++ b/service/src/com/android/car/hal/CarPropertyUtils.java
@@ -15,46 +15,20 @@
  */
 package com.android.car.hal;
 
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_BOOLEAN;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_BYTES;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_FLOAT_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_STRING;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_BOOLEAN;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType.VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_NONE;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_ZONE;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_SEAT;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_DOOR;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_WINDOW;
-import static com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleZoneType.VEHICLE_ZONE_TYPE_MIRROR;
-import static com.android.car.vehiclenetwork.VehiclePropValueUtil.getVectorValueType;
+import static com.android.car.CarServiceUtils.toByteArray;
 import static java.lang.Integer.toHexString;
 
 import android.car.VehicleAreaType;
 import android.car.VehicleZoneUtil;
 import android.car.hardware.CarPropertyConfig;
 import android.car.hardware.CarPropertyValue;
+import android.hardware.vehicle.V2_0.VehicleArea;
+import android.hardware.vehicle.V2_0.VehicleAreaConfig;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyType;
 
-import com.google.protobuf.ByteString;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -68,168 +42,136 @@
     /** Converts {@link VehiclePropValue} to {@link CarPropertyValue} */
     static CarPropertyValue<?> toCarPropertyValue(
             VehiclePropValue halValue, int propertyId) {
-        Class<?> clazz = getJavaClass(halValue.getValueType());
-        int areaId = halValue.getZone();
+        Class<?> clazz = getJavaClass(halValue.prop & VehiclePropertyType.MASK);
+        int areaId = halValue.areaId;
+        VehiclePropValue.RawValue v = halValue.value;
+
         if (Boolean.class == clazz) {
-            return new CarPropertyValue<>(propertyId, areaId, halValue.getInt32Values(0) == 1);
+            return new CarPropertyValue<>(propertyId, areaId, v.int32Values.get(0) == 1);
         } else if (String.class == clazz) {
-            return new CarPropertyValue<>(propertyId, areaId, halValue.getStringValue());
+            return new CarPropertyValue<>(propertyId, areaId, v.stringValue);
         } else if (Long.class == clazz) {
-            return new CarPropertyValue<>(propertyId, areaId, halValue.getInt64Value());
+            return new CarPropertyValue<>(propertyId, areaId, v.int64Values.get(0));
         } else if (byte[].class == clazz) {
-            byte[] halData = halValue.getBytesValue().toByteArray();
+            byte[] halData = toByteArray(v.bytes);
             return new CarPropertyValue<>(propertyId, areaId, halData);
         } else /* All list properties */ {
-            Object[] values = getRawValueList(clazz, halValue).toArray();
+            Object[] values = getRawValueList(clazz, v).toArray();
             return new CarPropertyValue<>(propertyId, areaId,
                     values.length == 1 ? values[0] : values);
         }
     }
 
     /** Converts {@link CarPropertyValue} to {@link VehiclePropValue} */
-    static VehiclePropValue toVehiclePropValue(CarPropertyValue hvacProp, int halPropId) {
-        VehiclePropValue.Builder builder = VehiclePropValue.newBuilder();
-        builder.setProp(halPropId);
+    static VehiclePropValue toVehiclePropValue(CarPropertyValue carProp, int halPropId) {
+        VehiclePropValue vehicleProp = new VehiclePropValue();
+        vehicleProp.prop = halPropId;
+        vehicleProp.areaId = carProp.getAreaId();
+        VehiclePropValue.RawValue v = vehicleProp.value;
 
-        if (hvacProp.getAreaId() != 0) {
-            builder.setZone(hvacProp.getAreaId());
-        }
+        Object o = carProp.getValue();
 
-        Object o = hvacProp.getValue();
-
-        boolean hasArea = hvacProp.getAreaId() != 0;
-        int vectorLength = (o instanceof Object[] ? ((Object[]) o).length : 0);
-        int halType;
         if (o instanceof Boolean) {
-            halType = hasArea ? VEHICLE_VALUE_TYPE_ZONED_BOOLEAN : VEHICLE_VALUE_TYPE_BOOLEAN;
-            builder.addInt32Values(((Boolean )o) ? 1 : 0);
+            v.int32Values.add(((Boolean )o) ? 1 : 0);
         } else if (o instanceof Integer) {
-            halType = hasArea ? VEHICLE_VALUE_TYPE_ZONED_INT32 : VEHICLE_VALUE_TYPE_INT32;
-            builder.addInt32Values((Integer) o);
+            v.int32Values.add((Integer) o);
         } else if (o instanceof Float) {
-            halType = hasArea ? VEHICLE_VALUE_TYPE_ZONED_FLOAT : VEHICLE_VALUE_TYPE_FLOAT;
-            builder.addFloatValues((Float) o);
+            v.floatValues.add((Float) o);
         } else if (o instanceof Integer[]) {
-            halType = getVectorValueType(
-                    hasArea ? VEHICLE_VALUE_TYPE_ZONED_INT32 : VEHICLE_VALUE_TYPE_ZONED_INT32,
-                    vectorLength);
-            for (Integer i : (Integer[]) o) {
-                builder.addInt32Values(i);
-            }
+            Collections.addAll(v.int32Values, (Integer[]) o);
         } else if (o instanceof Float[]) {
-            halType = getVectorValueType(
-                    hasArea ? VEHICLE_VALUE_TYPE_ZONED_FLOAT : VEHICLE_VALUE_TYPE_ZONED_FLOAT,
-                    vectorLength);
-            for (Float f : (Float[]) o) {
-                builder.addFloatValues(f);
-            }
+            Collections.addAll(v.floatValues, (Float[]) o);
         } else if (o instanceof String) {
-            halType = VEHICLE_VALUE_TYPE_STRING;
-            builder.setStringValue((String) o);
+            v.stringValue = (String) o;
         } else if (o instanceof byte[]) {
-            halType = VEHICLE_VALUE_TYPE_BYTES;  // We don't have zoned type in vehicle.h
-            builder.setBytesValue(ByteString.copyFrom((byte[]) o));
+            for (byte b : (byte[]) o) {
+                v.bytes.add(b);
+            }
         } else {
-            throw new IllegalArgumentException("Unexpected type in: " + hvacProp);
+            throw new IllegalArgumentException("Unexpected type in: " + carProp);
         }
-        builder.setValueType(halType);
-        return builder.build();
+
+        return vehicleProp;
     }
 
     /**
      * Converts {@link VehiclePropConfig} to {@link CarPropertyConfig}.
      */
     static CarPropertyConfig<?> toCarPropertyConfig(VehiclePropConfig p, int propertyId) {
-        int[] areas = VehicleZoneUtil.listAllZones(p.getZones());
+        int[] areas = VehicleZoneUtil.listAllZones(p.supportedAreas);
 
-        int areaType = getVehicleAreaType(VehicleNetworkConsts.getVehicleZoneType(p.getProp()));
+        int areaType = getVehicleAreaType(p.prop & VehicleArea.MASK);
 
-        Class<?> clazz = getJavaClass(p.getValueType());
+        Class<?> clazz = getJavaClass(p.prop & VehiclePropertyType.MASK);
         if (clazz == Boolean.class || clazz == byte[].class || clazz == String.class) {
             return CarPropertyConfig
                     .newBuilder(clazz, propertyId, areaType, /* capacity */ 1)
                     .addAreas(areas)
                     .build();
         } else {
-            List mins;
-            List maxs;
-            if (classMatched(Integer.class, clazz)) {
-                mins = p.getInt32MinsList();
-                maxs = p.getInt32MaxsList();
-            } else if (classMatched(Float.class, clazz)) {
-                mins = p.getFloatMinsList();
-                maxs = p.getFloatMaxsList();
-            } else {
-                throw new IllegalArgumentException("Unexpected type: " + clazz);
-            }
             CarPropertyConfig.Builder builder = CarPropertyConfig
-                    .newBuilder(clazz, propertyId, areaType, /* capacity */ mins.size());
-            for (int i = 0; i < mins.size(); i++) {
-                int areaId = areas.length == 0 ? 0 : areas[i];
-                builder.addAreaConfig(areaId, mins.get(i), maxs.get(i));
+                    .newBuilder(clazz, propertyId, areaType, /* capacity */  p.areaConfigs.size());
+
+            for (VehicleAreaConfig area : p.areaConfigs) {
+                if (classMatched(Integer.class, clazz)) {
+                    builder.addAreaConfig(area.areaId, area.minInt32Value, area.maxInt32Value);
+                } else if (classMatched(Float.class, clazz)) {
+                    builder.addAreaConfig(area.areaId, area.minFloatValue, area.maxFloatValue);
+                } else if (classMatched(Long.class, clazz)) {
+                    builder.addAreaConfig(area.areaId, area.minInt64Value, area.maxInt64Value);
+                } else {
+                    throw new IllegalArgumentException("Unexpected type: " + clazz);
+                }
             }
             return builder.build();
         }
     }
 
-    private static @VehicleAreaType.VehicleAreaTypeValue int getVehicleAreaType(int zoneType) {
-        switch (zoneType) {
-            case VEHICLE_ZONE_TYPE_NONE:
+    private static @VehicleAreaType.VehicleAreaTypeValue int getVehicleAreaType(int halArea) {
+        switch (halArea) {
+            case VehicleArea.GLOBAL:
                 return VehicleAreaType.VEHICLE_AREA_TYPE_NONE;
-            case VEHICLE_ZONE_TYPE_ZONE:
+            case VehicleArea.ZONE:
                 return VehicleAreaType.VEHICLE_AREA_TYPE_ZONE;
-            case VEHICLE_ZONE_TYPE_SEAT:
+            case VehicleArea.SEAT:
                 return VehicleAreaType.VEHICLE_AREA_TYPE_SEAT;
-            case VEHICLE_ZONE_TYPE_DOOR:
+            case VehicleArea.DOOR:
                 return VehicleAreaType.VEHICLE_AREA_TYPE_DOOR;
-            case VEHICLE_ZONE_TYPE_WINDOW:
+            case VehicleArea.WINDOW:
                 return VehicleAreaType.VEHICLE_AREA_TYPE_WINDOW;
-            case VEHICLE_ZONE_TYPE_MIRROR:
+            case VehicleArea.MIRROR:
                 return VehicleAreaType.VEHICLE_AREA_TYPE_MIRROR;
             default:
-                throw new RuntimeException("Unsupported zone type " + zoneType);
+                throw new RuntimeException("Unsupported area type " + halArea);
         }
     }
 
     private static Class<?> getJavaClass(int halType) {
         switch (halType) {
-            case VEHICLE_VALUE_TYPE_BOOLEAN:
-            case VEHICLE_VALUE_TYPE_ZONED_BOOLEAN:
+            case VehiclePropertyType.BOOLEAN:
                 return Boolean.class;
-            case VEHICLE_VALUE_TYPE_FLOAT:
-            case VEHICLE_VALUE_TYPE_ZONED_FLOAT:
+            case VehiclePropertyType.FLOAT:
                 return Float.class;
-            case VEHICLE_VALUE_TYPE_INT32:
-            case VEHICLE_VALUE_TYPE_ZONED_INT32:
+            case VehiclePropertyType.INT32:
                 return Integer.class;
-            case VEHICLE_VALUE_TYPE_INT32_VEC2:
-            case VEHICLE_VALUE_TYPE_INT32_VEC3:
-            case VEHICLE_VALUE_TYPE_INT32_VEC4:
-            case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC2:
-            case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC3:
-            case VEHICLE_VALUE_TYPE_ZONED_INT32_VEC4:
+            case VehiclePropertyType.INT32_VEC:
                 return Integer[].class;
-            case VEHICLE_VALUE_TYPE_FLOAT_VEC2:
-            case VEHICLE_VALUE_TYPE_FLOAT_VEC3:
-            case VEHICLE_VALUE_TYPE_FLOAT_VEC4:
-            case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC2:
-            case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC3:
-            case VEHICLE_VALUE_TYPE_ZONED_FLOAT_VEC4:
+            case VehiclePropertyType.FLOAT_VEC:
                 return Float[].class;
-            case VEHICLE_VALUE_TYPE_STRING:
+            case VehiclePropertyType.STRING:
                 return String.class;
-            case VEHICLE_VALUE_TYPE_BYTES:
+            case VehiclePropertyType.BYTES:
                 return byte[].class;
             default:
                 throw new IllegalArgumentException("Unexpected type: " + toHexString(halType));
         }
     }
 
-    private static List getRawValueList(Class<?> clazz, VehiclePropValue vehiclePropValue) {
+    private static List getRawValueList(Class<?> clazz, VehiclePropValue.RawValue value) {
         if (classMatched(Float.class, clazz)) {
-            return vehiclePropValue.getFloatValuesList();
+            return value.floatValues;
         } else if (classMatched(Integer.class, clazz)) {
-            return vehiclePropValue.getInt32ValuesList();
+            return value.int32Values;
         } else {
             throw new IllegalArgumentException("Unexpected type: " + clazz);
         }
diff --git a/service/src/com/android/car/hal/HalClient.java b/service/src/com/android/car/hal/HalClient.java
new file mode 100644
index 0000000..ee5e593
--- /dev/null
+++ b/service/src/com/android/car/hal/HalClient.java
@@ -0,0 +1,261 @@
+/*
+ * 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.
+ */
+
+package com.android.car.hal;
+
+import static android.os.SystemClock.elapsedRealtime;
+
+import android.hardware.vehicle.V2_0.IVehicle;
+import android.hardware.vehicle.V2_0.IVehicle.getCallback;
+import android.hardware.vehicle.V2_0.IVehicleCallback;
+import android.hardware.vehicle.V2_0.StatusCode;
+import android.hardware.vehicle.V2_0.SubscribeFlags;
+import android.hardware.vehicle.V2_0.SubscribeOptions;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.os.Handler;
+import android.os.IHwBinder;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+
+import com.android.car.CarLog;
+
+import java.util.ArrayList;
+
+/**
+ * Vehicle HAL client. Interacts directly with Vehicle HAL interface {@link IVehicle}. Contains
+ * some logic for retriable properties, redirects Vehicle notifications into given looper thread.
+ */
+class  HalClient {
+    /**
+     * If call to vehicle HAL returns StatusCode.TRY_AGAIN, than {@link HalClient} will retry to
+     * invoke that method again for this amount of milliseconds.
+     */
+    private static final int WAIT_CAP_FOR_RETRIABLE_RESULT_MS = 2000;
+
+    private static final int SLEEP_BETWEEN_RETRIABLE_INVOKES_MS = 50;
+
+    private final IVehicle mVehicle;
+
+    private final IVehicleCallback mInternalCallback;
+
+    /**
+     * Create HalClient object
+     *
+     * @param vehicle interface to the vehicle HAL
+     * @param looper looper that will be used to propagate notifications from vehicle HAL
+     * @param callback to propagate notifications from Vehicle HAL in the provided looper thread
+     */
+    HalClient(IVehicle vehicle, Looper looper, IVehicleCallback callback) {
+        mVehicle = vehicle;
+        Handler handler = new CallbackHandler(looper, callback);
+        mInternalCallback = new VehicleCallback(handler);
+    }
+
+    ArrayList<VehiclePropConfig> getAllPropConfigs() {
+        return mVehicle.getAllPropConfigs();
+    }
+
+    public void subscribe(int prop, float sampleRateHz) {
+        SubscribeOptions opt = new SubscribeOptions();
+        opt.propId = prop;
+        opt.sampleRate = sampleRateHz;
+        opt.flags = SubscribeFlags.HAL_EVENT;
+        ArrayList<SubscribeOptions> options = new ArrayList<>(1);
+        options.add(opt);
+        mVehicle.subscribe(mInternalCallback, options);
+    }
+
+    public void unsubscribe(int prop) {
+        mVehicle.unsubscribe(mInternalCallback, prop);
+    }
+
+    public void setValue(VehiclePropValue propValue) throws PropertyTimeoutException {
+        int status = invokeRetriable(() -> mVehicle.set(propValue),
+                WAIT_CAP_FOR_RETRIABLE_RESULT_MS, SLEEP_BETWEEN_RETRIABLE_INVOKES_MS);
+
+        if (StatusCode.INVALID_ARG == status) {
+            throw new IllegalArgumentException(
+                    String.format("Failed to set value for: 0x%x, areaId: 0x%x",
+                            propValue.prop, propValue.areaId));
+        }
+
+        if (StatusCode.TRY_AGAIN == status) {
+            throw new PropertyTimeoutException(propValue.prop);
+        }
+
+        if (StatusCode.OK != status) {
+            throw new IllegalStateException(
+                    String.format("Failed to set property: 0x%x, areaId: 0x%x, "
+                            + "code: %d", propValue.prop, propValue.areaId, status));
+        }
+    }
+
+    VehiclePropValue getValue(VehiclePropValue requestedPropValue) throws PropertyTimeoutException {
+        final ObjectWrapper<VehiclePropValue> valueWrapper = new ObjectWrapper<>();
+        int status = invokeRetriable(() -> {
+            ValueResult res = internalGet(requestedPropValue);
+            valueWrapper.object = res.propValue;
+            return res.status;
+        }, WAIT_CAP_FOR_RETRIABLE_RESULT_MS, SLEEP_BETWEEN_RETRIABLE_INVOKES_MS);
+
+        int propId = requestedPropValue.prop;
+        int areaId = requestedPropValue.areaId;
+        if (StatusCode.INVALID_ARG == status) {
+            throw new IllegalArgumentException(
+                    String.format("Failed to get value for: 0x%x, areaId: 0x%x", propId, areaId));
+        }
+
+        if (StatusCode.TRY_AGAIN == status) {
+            throw new PropertyTimeoutException(propId);
+        }
+
+        if (StatusCode.OK != status || valueWrapper.object == null) {
+            throw new IllegalStateException(
+                    String.format("Failed to get property: 0x%x, areaId: 0x%x, "
+                            + "code: %d", propId, areaId, status));
+        }
+
+        return valueWrapper.object;
+    }
+
+    private ValueResult internalGet(VehiclePropValue requestedPropValue) {
+        final ValueResult result = new ValueResult();
+        mVehicle.get(requestedPropValue,
+                new getCallback() {
+                    @Override
+                    public void onValues(int status, VehiclePropValue propValue) {
+                        result.status = status;
+                        result.propValue = propValue;
+                    }
+                });
+
+        return result;
+    }
+
+    interface RetriableCallback {
+        /** Returns {@link StatusCode} */
+        int action();
+    }
+
+    private static int invokeRetriable(RetriableCallback callback, long timeoutMs, long sleepMs) {
+        int status = callback.action();
+        long startTime = elapsedRealtime();
+        while (StatusCode.TRY_AGAIN == status && (elapsedRealtime() - startTime) < timeoutMs) {
+            try {
+                Thread.sleep(sleepMs);
+            } catch (InterruptedException e) {
+                Log.e(CarLog.TAG_HAL, "Thread was interrupted while waiting for vehicle HAL.", e);
+                break;
+            }
+
+            status = callback.action();
+        }
+        return status;
+    }
+
+    private static class ObjectWrapper<T> {
+        T object;
+    }
+
+    private static class ValueResult {
+        int status;
+        VehiclePropValue propValue;
+    }
+
+    private static class PropertySetError {
+        final int errorCode;
+        final int propId;
+        final int areaId;
+
+        PropertySetError(int errorCode, int propId, int areaId) {
+            this.errorCode = errorCode;
+            this.propId = propId;
+            this.areaId = areaId;
+        }
+    }
+
+    private static class CallbackHandler extends Handler {
+        private static final int MSG_ON_PROPERTY_SET = 1;
+        private static final int MSG_ON_PROPERTY_EVENT = 2;
+        private static final int MSG_ON_SET_ERROR = 3;
+
+        private final IVehicleCallback mCallback;
+
+        CallbackHandler(Looper looper, IVehicleCallback callback) {
+            super(looper);
+            mCallback = callback;
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+
+            switch (msg.what) {
+                case MSG_ON_PROPERTY_EVENT:
+                    mCallback.onPropertyEvent((ArrayList<VehiclePropValue>) msg.obj);
+                    break;
+                case MSG_ON_PROPERTY_SET:
+                    mCallback.onPropertySet((VehiclePropValue) msg.obj);
+                    break;
+                case MSG_ON_SET_ERROR:
+                    PropertySetError obj = (PropertySetError) msg.obj;
+                    mCallback.onPropertySetError(obj.errorCode, obj.propId, obj.areaId);
+                    break;
+                default:
+                        Log.e(CarLog.TAG_HAL, "Unexpected message: " + msg.what);
+            }
+        }
+    }
+
+    private static class VehicleCallback implements IVehicleCallback {
+        private Handler mHandler;
+
+        VehicleCallback(Handler handler) {
+            mHandler = handler;
+        }
+
+        @Override
+        public IHwBinder asBinder() {
+            return null;
+        }
+
+        @Override
+        public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
+            mHandler.sendMessage(Message.obtain(
+                    mHandler, CallbackHandler.MSG_ON_PROPERTY_EVENT, propValues));
+        }
+
+        @Override
+        public void onPropertySet(VehiclePropValue propValue) {
+            mHandler.sendMessage(Message.obtain(
+                    mHandler, CallbackHandler.MSG_ON_PROPERTY_SET, propValue));
+        }
+
+        @Override
+        public void onPropertySetError(int errorCode, int propId, int areaId) {
+            mHandler.sendMessage(Message.obtain(
+                    mHandler, CallbackHandler.MSG_ON_SET_ERROR,
+                    new PropertySetError(errorCode, propId, areaId)));
+        }
+
+        @Override
+        public ArrayList<String> interfaceChain() {
+            return null;
+        }
+    }
+}
diff --git a/service/src/com/android/car/hal/HalServiceBase.java b/service/src/com/android/car/hal/HalServiceBase.java
index 3a801fd..30115ae 100644
--- a/service/src/com/android/car/hal/HalServiceBase.java
+++ b/service/src/com/android/car/hal/HalServiceBase.java
@@ -16,10 +16,13 @@
 
 package com.android.car.hal;
 
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
+
+import android.annotation.Nullable;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
 
 import java.io.PrintWriter;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -51,8 +54,11 @@
      * @param allProperties
      * @return null if no properties are supported.
      */
-    public abstract List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties);
+    @Nullable
+    public Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
+        return null;
+    }
 
     public abstract void handleHalEvents(List<VehiclePropValue> values);
 
diff --git a/service/src/com/android/car/hal/HvacHalService.java b/service/src/com/android/car/hal/HvacHalService.java
index b6996bf..77b5364 100644
--- a/service/src/com/android/car/hal/HvacHalService.java
+++ b/service/src/com/android/car/hal/HvacHalService.java
@@ -16,70 +16,51 @@
 package com.android.car.hal;
 
 import android.car.hardware.hvac.CarHvacManager;
-
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
+import android.hardware.vehicle.V2_0.VehicleProperty;
 
 public class HvacHalService extends PropertyHalServiceBase {
     private static final boolean DBG = false;
     private static final String TAG = "HvacHalService";
 
     private final ManagerToHalPropIdMap mMgrHalPropIdMap = ManagerToHalPropIdMap.create(new int[] {
-           CarHvacManager.ID_MIRROR_DEFROSTER_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_SIDE_MIRROR_HEAT,
+           CarHvacManager.ID_MIRROR_DEFROSTER_ON, VehicleProperty.HVAC_SIDE_MIRROR_HEAT,
 
-           CarHvacManager.ID_STEERING_WHEEL_TEMP,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_STEERING_WHEEL_TEMP,
+           CarHvacManager.ID_STEERING_WHEEL_TEMP, VehicleProperty.HVAC_STEERING_WHEEL_TEMP,
 
-           CarHvacManager.ID_OUTSIDE_AIR_TEMP,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_ENV_OUTSIDE_TEMPERATURE,
+           CarHvacManager.ID_OUTSIDE_AIR_TEMP, VehicleProperty.ENV_OUTSIDE_TEMPERATURE,
 
-           CarHvacManager.ID_TEMPERATURE_UNITS,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_UNITS,
+           CarHvacManager.ID_TEMPERATURE_UNITS, VehicleProperty.HVAC_TEMPERATURE_UNITS,
 
-           CarHvacManager.ID_ZONED_TEMP_SETPOINT,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_SET,
+           CarHvacManager.ID_ZONED_TEMP_SETPOINT, VehicleProperty.HVAC_TEMPERATURE_SET,
 
-           CarHvacManager.ID_ZONED_TEMP_ACTUAL,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_TEMPERATURE_CURRENT,
+           CarHvacManager.ID_ZONED_TEMP_ACTUAL, VehicleProperty.HVAC_TEMPERATURE_CURRENT,
 
-           CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_SPEED,
+           CarHvacManager.ID_ZONED_FAN_SPEED_SETPOINT, VehicleProperty.HVAC_FAN_SPEED,
 
-           CarHvacManager.ID_ZONED_FAN_SPEED_RPM,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_ACTUAL_FAN_SPEED_RPM,
+           CarHvacManager.ID_ZONED_FAN_SPEED_RPM, VehicleProperty.HVAC_ACTUAL_FAN_SPEED_RPM,
 
            CarHvacManager.ID_ZONED_FAN_POSITION_AVAILABLE,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION_AVAILABLE,
+           VehicleProperty.HVAC_FAN_DIRECTION_AVAILABLE,
 
-           CarHvacManager.ID_ZONED_FAN_POSITION,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_FAN_DIRECTION,
+           CarHvacManager.ID_ZONED_FAN_POSITION, VehicleProperty.HVAC_FAN_DIRECTION,
 
-           CarHvacManager.ID_ZONED_SEAT_TEMP,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_SEAT_TEMPERATURE,
+           CarHvacManager.ID_ZONED_SEAT_TEMP, VehicleProperty.HVAC_SEAT_TEMPERATURE,
 
-           CarHvacManager.ID_ZONED_AC_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AC_ON,
+           CarHvacManager.ID_ZONED_AC_ON, VehicleProperty.HVAC_AC_ON,
 
-           CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_AUTO_ON,
+           CarHvacManager.ID_ZONED_AUTOMATIC_MODE_ON, VehicleProperty.HVAC_AUTO_ON,
 
-           CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_RECIRC_ON,
+           CarHvacManager.ID_ZONED_AIR_RECIRCULATION_ON,VehicleProperty.HVAC_RECIRC_ON,
 
-           CarHvacManager.ID_ZONED_MAX_AC_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_MAX_AC_ON,
+           CarHvacManager.ID_ZONED_MAX_AC_ON, VehicleProperty.HVAC_MAX_AC_ON,
 
-           CarHvacManager.ID_ZONED_DUAL_ZONE_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DUAL_ON,
+           CarHvacManager.ID_ZONED_DUAL_ZONE_ON, VehicleProperty.HVAC_DUAL_ON,
 
-           CarHvacManager.ID_ZONED_MAX_DEFROST_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_MAX_DEFROST_ON,
+           CarHvacManager.ID_ZONED_MAX_DEFROST_ON, VehicleProperty.HVAC_MAX_DEFROST_ON,
 
-           CarHvacManager.ID_ZONED_HVAC_POWER_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_POWER_ON,
+           CarHvacManager.ID_ZONED_HVAC_POWER_ON, VehicleProperty.HVAC_POWER_ON,
 
-           CarHvacManager.ID_WINDOW_DEFROSTER_ON,
-           VehicleNetworkConsts.VEHICLE_PROPERTY_HVAC_DEFROSTER
+           CarHvacManager.ID_WINDOW_DEFROSTER_ON, VehicleProperty.HVAC_DEFROSTER
     });
 
     public HvacHalService(VehicleHal vehicleHal) {
diff --git a/service/src/com/android/car/hal/InfoHalService.java b/service/src/com/android/car/hal/InfoHalService.java
index 490779b..56e3b08 100644
--- a/service/src/com/android/car/hal/InfoHalService.java
+++ b/service/src/com/android/car/hal/InfoHalService.java
@@ -16,17 +16,16 @@
 package com.android.car.hal;
 
 import android.car.CarInfoManager;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
 import android.os.Bundle;
 import android.util.Log;
 
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
 
 import java.io.PrintWriter;
-import java.util.HashMap;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -50,23 +49,19 @@
     }
 
     @Override
-    public synchronized List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties) {
-        VehicleNetwork vn = mHal.getVehicleNetwork();
-        List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
+    public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
+        List<VehiclePropConfig> supported = new LinkedList<>();
         for (VehiclePropConfig p: allProperties) {
-            switch (p.getProp()) {
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MAKE:
-                    mBasicInfo.putString(CarInfoManager.BASIC_INFO_KEY_MANUFACTURER,
-                            vn.getStringProperty(p.getProp()));
+            switch (p.prop) {
+                case VehicleProperty.INFO_MAKE:
+                    readPropertyToBundle(p.prop, CarInfoManager.BASIC_INFO_KEY_MANUFACTURER);
                     break;
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL:
-                    mBasicInfo.putString(CarInfoManager.BASIC_INFO_KEY_MODEL,
-                            vn.getStringProperty(p.getProp()));
+                case VehicleProperty.INFO_MODEL:
+                    readPropertyToBundle(p.prop, CarInfoManager.BASIC_INFO_KEY_MODEL);
                     break;
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_INFO_MODEL_YEAR:
-                    mBasicInfo.putString(CarInfoManager.BASIC_INFO_KEY_MODEL_YEAR,
-                            vn.getStringProperty(p.getProp()));
+                case VehicleProperty.INFO_MODEL_YEAR:
+                    readPropertyToBundle(p.prop, CarInfoManager.BASIC_INFO_KEY_MODEL_YEAR);
                     break;
                 default: // not supported
                     break;
@@ -75,10 +70,20 @@
         return supported;
     }
 
+    private void readPropertyToBundle(int prop, String key) {
+        String value = "";
+        try {
+            value = mHal.get(String.class, prop);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_INFO, "Unable to read property", e);
+        }
+        mBasicInfo.putString(key, value);
+    }
+
     @Override
     public void handleHalEvents(List<VehiclePropValue> values) {
         for (VehiclePropValue v : values) {
-            logUnexpectedEvent(v.getProp());
+            logUnexpectedEvent(v.prop);
         }
     }
 
diff --git a/service/src/com/android/car/hal/InputHalService.java b/service/src/com/android/car/hal/InputHalService.java
index 41a4b87..6d6521f 100644
--- a/service/src/com/android/car/hal/InputHalService.java
+++ b/service/src/com/android/car/hal/InputHalService.java
@@ -15,6 +15,12 @@
  */
 package com.android.car.hal;
 
+import static android.hardware.vehicle.V2_0.VehicleProperty.HW_KEY_INPUT;
+
+import android.hardware.vehicle.V2_0.VehicleDisplay;
+import android.hardware.vehicle.V2_0.VehicleHwKeyInputAction;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
 import android.os.SystemClock;
 import android.util.Log;
 import android.util.SparseLongArray;
@@ -22,21 +28,17 @@
 import android.view.KeyEvent;
 
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleDisplay;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleHwKeyInputAction;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
 
 import java.io.PrintWriter;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
 public class InputHalService extends HalServiceBase {
 
-    public static final int DISPLAY_MAIN = VehicleDisplay.VEHICLE_DISPLAY_MAIN;
-    public static final int DISPLAY_INSTRUMENT_CLUSTER =
-            VehicleDisplay.VEHICLE_DISPLAY_INSTRUMENT_CLUSTER;
+    public static final int DISPLAY_MAIN = VehicleDisplay.MAIN;
+    public static final int DISPLAY_INSTRUMENT_CLUSTER = VehicleDisplay.INSTRUMENT_CLUSTER;
+    private final VehicleHal mHal;
 
     public interface InputListener {
         void onKeyEvent(KeyEvent event, int targetDisplay);
@@ -48,6 +50,10 @@
     private InputListener mListener;
     private final SparseLongArray mKeyDownTimes = new SparseLongArray();
 
+    public InputHalService(VehicleHal hal) {
+        mHal = hal;
+    }
+
     public void setInputListener(InputListener listener) {
         synchronized (this) {
             if (!mKeyInputSupported) {
@@ -56,8 +62,7 @@
             }
             mListener = listener;
         }
-        VehicleHal.getInstance().subscribeProperty(this,
-                VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT, 0);
+        mHal.subscribeProperty(this, HW_KEY_INPUT, 0);
     }
 
     public synchronized boolean isKeyInputSupported() {
@@ -77,10 +82,11 @@
     }
 
     @Override
-    public List<VehiclePropConfig> takeSupportedProperties(List<VehiclePropConfig> allProperties) {
-        List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
+    public Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
+        List<VehiclePropConfig> supported = new LinkedList<>();
         for (VehiclePropConfig p: allProperties) {
-            if (p.getProp() == VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT) {
+            if (p.prop == HW_KEY_INPUT) {
                 supported.add(p);
                 synchronized (this) {
                     mKeyInputSupported = true;
@@ -92,7 +98,7 @@
 
     @Override
     public void handleHalEvents(List<VehiclePropValue> values) {
-        InputListener listener = null;
+        InputListener listener;
         synchronized (this) {
             listener = mListener;
         }
@@ -101,19 +107,18 @@
             return;
         }
         for (VehiclePropValue v : values) {
-            if (v.getProp() != VehicleNetworkConsts.VEHICLE_PROPERTY_HW_KEY_INPUT) {
+            if (v.prop != HW_KEY_INPUT) {
                 Log.e(CarLog.TAG_INPUT, "Wrong event dispatched, prop:0x" +
-                        Integer.toHexString(v.getProp()));
+                        Integer.toHexString(v.prop));
                 continue;
             }
-            int action = (v.getInt32Values(0) ==
-                    VehicleHwKeyInputAction.VEHICLE_HW_KEY_INPUT_ACTION_DOWN) ?
+            int action = (v.value.int32Values.get(0) == VehicleHwKeyInputAction.ACTION_DOWN) ?
                             KeyEvent.ACTION_DOWN : KeyEvent.ACTION_UP;
-            int code = v.getInt32Values(1);
-            int display = v.getInt32Values(2);
+            int code = v.value.int32Values.get(1);
+            int display = v.value.int32Values.get(2);
             if (DBG) {
-                Log.i(CarLog.TAG_INPUT, "hal event code:" + code + ",action:" + action +
-                        ",display:" + display);
+                Log.i(CarLog.TAG_INPUT, "hal event code:" + code + ", action:" + action +
+                        ", display:" + display);
             }
 
             dispatchKeyEvent(listener, action, code, display);
diff --git a/service/src/com/android/car/hal/PowerHalService.java b/service/src/com/android/car/hal/PowerHalService.java
index 580e7a7..ff43cfc 100644
--- a/service/src/com/android/car/hal/PowerHalService.java
+++ b/service/src/com/android/car/hal/PowerHalService.java
@@ -15,69 +15,64 @@
  */
 package com.android.car.hal;
 
-import android.os.ServiceSpecificException;
+import static android.hardware.vehicle.V2_0.VehicleProperty.AP_POWER_STATE;
+import static android.hardware.vehicle.V2_0.VehicleProperty.DISPLAY_BRIGHTNESS;
+
+import android.annotation.Nullable;
+import android.hardware.vehicle.V2_0.VehicleApPowerSetState;
+import android.hardware.vehicle.V2_0.VehicleApPowerState;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateConfigFlag;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateIndex;
+import android.hardware.vehicle.V2_0.VehicleApPowerStateShutdownParam;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
 import android.util.Log;
 
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerSetState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerState;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateConfigFlag;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateIndex;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleApPowerStateShutdownParam;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.PrintWriter;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 
 public class PowerHalService extends HalServiceBase {
 
-    public static final int STATE_OFF = VehicleApPowerState.VEHICLE_AP_POWER_STATE_OFF;
-    public static final int STATE_DEEP_SLEEP =
-            VehicleApPowerState.VEHICLE_AP_POWER_STATE_DEEP_SLEEP;
-    public static final int STATE_ON_DISP_OFF =
-            VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_DISP_OFF;
-    public static final int STATE_ON_FULL = VehicleApPowerState.VEHICLE_AP_POWER_STATE_ON_FULL;
-    public static final int STATE_SHUTDOWN_PREPARE =
-            VehicleApPowerState.VEHICLE_AP_POWER_STATE_SHUTDOWN_PREPARE;
+    public static final int STATE_OFF = VehicleApPowerState.OFF;
+    public static final int STATE_DEEP_SLEEP = VehicleApPowerState.DEEP_SLEEP;
+    public static final int STATE_ON_DISP_OFF = VehicleApPowerState.ON_DISP_OFF;
+    public static final int STATE_ON_FULL = VehicleApPowerState.ON_FULL;
+    public static final int STATE_SHUTDOWN_PREPARE = VehicleApPowerState.SHUTDOWN_PREPARE;
 
     @VisibleForTesting
-    public static final int SET_BOOT_COMPLETE =
-            VehicleApPowerSetState.VEHICLE_AP_POWER_SET_BOOT_COMPLETE;
+    public static final int SET_BOOT_COMPLETE = VehicleApPowerSetState.BOOT_COMPLETE;
     @VisibleForTesting
-    public static final int SET_DEEP_SLEEP_ENTRY =
-            VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY;
+    public static final int SET_DEEP_SLEEP_ENTRY = VehicleApPowerSetState.DEEP_SLEEP_ENTRY;
     @VisibleForTesting
-    public static final int SET_DEEP_SLEEP_EXIT =
-            VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT;
+    public static final int SET_DEEP_SLEEP_EXIT = VehicleApPowerSetState.DEEP_SLEEP_EXIT;
     @VisibleForTesting
-    public static final int SET_SHUTDOWN_POSTPONE =
-            VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE;
+    public static final int SET_SHUTDOWN_POSTPONE = VehicleApPowerSetState.SHUTDOWN_POSTPONE;
     @VisibleForTesting
-    public static final int SET_SHUTDOWN_START =
-            VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_START;
+    public static final int SET_SHUTDOWN_START = VehicleApPowerSetState.SHUTDOWN_START;
     @VisibleForTesting
-    public static final int SET_DISPLAY_ON = VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_ON;
+    public static final int SET_DISPLAY_ON = VehicleApPowerSetState.DISPLAY_ON;
     @VisibleForTesting
     public static final int SET_DISPLAY_OFF =
-            VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_OFF;
+            VehicleApPowerSetState.DISPLAY_OFF;
 
     @VisibleForTesting
     public static final int FLAG_SHUTDOWN_PARAM_CAN_SLEEP =
-            VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP;
+            VehicleApPowerStateShutdownParam.CAN_SLEEP;
     @VisibleForTesting
     public static final int FLAG_SHUTDOWN_IMMEDIATELY =
-            VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY;
+            VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY;
 
     public interface PowerEventListener {
         /**
          * Received power state change event.
          * @param state One of STATE_*
-         * @param param
          */
         void onApPowerStateChange(PowerState state);
         /**
@@ -91,12 +86,12 @@
         /**
          * One of STATE_*
          */
-        public final int state;
-        public final int param;
+        public final int mState;
+        public final int mParam;
 
         public PowerState(int state, int param) {
-            this.state = state;
-            this.param = param;
+            this.mState = state;
+            this.mParam = param;
         }
 
         /**
@@ -106,12 +101,10 @@
          * @throws IllegalStateException
          */
         public boolean canEnterDeepSleep() {
-            if (state != STATE_SHUTDOWN_PREPARE) {
+            if (mState != STATE_SHUTDOWN_PREPARE) {
                 throw new IllegalStateException("wrong state");
             }
-            return (param &
-                    VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_CAN_SLEEP) !=
-                    0;
+            return (mParam & VehicleApPowerStateShutdownParam.CAN_SLEEP) != 0;
         }
 
         /**
@@ -121,12 +114,10 @@
          * @throws IllegalStateException
          */
         public boolean canPostponeShutdown() {
-            if (state != STATE_SHUTDOWN_PREPARE) {
+            if (mState != STATE_SHUTDOWN_PREPARE) {
                 throw new IllegalStateException("wrong state");
             }
-            return (param &
-                    VehicleApPowerStateShutdownParam.VEHICLE_AP_POWER_SHUTDOWN_PARAM_SHUTDOWN_IMMEDIATELY)
-                    == 0;
+            return (mParam & VehicleApPowerStateShutdownParam.SHUTDOWN_IMMEDIATELY) == 0;
         }
 
         @Override
@@ -138,12 +129,12 @@
                 return false;
             }
             PowerState that = (PowerState) o;
-            return this.state == that.state && this.param == that.param;
+            return this.mState == that.mState && this.mParam == that.mParam;
         }
 
         @Override
         public String toString() {
-            return "PowerState state:" + state + ",param:" + param;
+            return "PowerState state:" + mState + ", param:" + mParam;
         }
     }
 
@@ -174,98 +165,99 @@
 
     public void sendBootComplete() {
         Log.i(CarLog.TAG_POWER, "send boot complete");
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_BOOT_COMPLETE, 0);
+        setPowerState(VehicleApPowerSetState.BOOT_COMPLETE, 0);
     }
 
     public void sendSleepEntry() {
         Log.i(CarLog.TAG_POWER, "send sleep entry");
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_ENTRY, 0);
+        setPowerState(VehicleApPowerSetState.DEEP_SLEEP_ENTRY, 0);
     }
 
     public void sendSleepExit() {
         Log.i(CarLog.TAG_POWER, "send sleep exit");
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DEEP_SLEEP_EXIT, 0);
+        setPowerState(VehicleApPowerSetState.DEEP_SLEEP_EXIT, 0);
     }
 
     public void sendShutdownPostpone(int postponeTimeMs) {
         Log.i(CarLog.TAG_POWER, "send shutdown postpone, time:" + postponeTimeMs);
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_POSTPONE,
+        setPowerState(VehicleApPowerSetState.SHUTDOWN_POSTPONE,
                 postponeTimeMs);
     }
 
     public void sendShutdownStart(int wakeupTimeSec) {
         Log.i(CarLog.TAG_POWER, "send shutdown start");
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_SHUTDOWN_START, 0);
+        setPowerState(VehicleApPowerSetState.SHUTDOWN_START, 0);
     }
 
     public void sendDisplayOn() {
         Log.i(CarLog.TAG_POWER, "send display on");
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_ON, 0);
+        setPowerState(VehicleApPowerSetState.DISPLAY_ON, 0);
     }
 
     public void sendDisplayOff() {
         Log.i(CarLog.TAG_POWER, "send display off");
-        setPowerState(VehicleApPowerSetState.VEHICLE_AP_POWER_SET_DISPLAY_OFF, 0);
+        setPowerState(VehicleApPowerSetState.DISPLAY_OFF, 0);
     }
 
     private void setPowerState(int state, int additionalParam) {
         int[] values = { state, additionalParam };
         try {
-            mHal.getVehicleNetwork().setIntVectorProperty(
-                    VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE, values);
-        } catch (ServiceSpecificException e) {
+            mHal.set(VehicleProperty.AP_POWER_STATE).to(values);
+        } catch (PropertyTimeoutException e) {
             Log.e(CarLog.TAG_POWER, "cannot set to AP_POWER_STATE", e);
         }
     }
 
+    @Nullable
     public PowerState getCurrentPowerState() {
-        int[] state = mHal.getVehicleNetwork().getIntVectorProperty(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
-        return new PowerState(state[VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_STATE],
-                state[VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL]);
+        int[] state;
+        try {
+            state = mHal.get(int[].class, VehicleProperty.AP_POWER_STATE);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_POWER, "Cannot get AP_POWER_STATE", e);
+            return null;
+        }
+        return new PowerState(state[VehicleApPowerStateIndex.STATE],
+                state[VehicleApPowerStateIndex.ADDITIONAL]);
     }
 
     public synchronized boolean isPowerStateSupported() {
-        VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
+        VehiclePropConfig config = mProperties.get(VehicleProperty.AP_POWER_STATE);
         return config != null;
     }
 
     public synchronized boolean isDeepSleepAllowed() {
-        VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
+        VehiclePropConfig config = mProperties.get(VehicleProperty.AP_POWER_STATE);
         if (config == null) {
             return false;
         }
-        return (config.getConfigArray(0) &
-                VehicleApPowerStateConfigFlag.VEHICLE_AP_POWER_STATE_CONFIG_ENABLE_DEEP_SLEEP_FLAG)
-                != 0;
+        return (config.configArray.get(0)
+                & VehicleApPowerStateConfigFlag.ENABLE_DEEP_SLEEP_FLAG) != 0;
     }
 
     public synchronized boolean isTimedWakeupAllowed() {
         VehiclePropConfig config = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE);
+                AP_POWER_STATE);
         if (config == null) {
             return false;
         }
-        return (config.getConfigArray(0) &
-                VehicleApPowerStateConfigFlag.VEHICLE_AP_POWER_STATE_CONFIG_SUPPORT_TIMER_POWER_ON_FLAG)
-                != 0;
+        return (config.configArray.get(0)
+                & VehicleApPowerStateConfigFlag.CONFIG_SUPPORT_TIMER_POWER_ON_FLAG) != 0;
     }
 
     @Override
     public synchronized void init() {
         for (VehiclePropConfig config : mProperties.values()) {
             if (VehicleHal.isPropertySubscribable(config)) {
-                mHal.subscribeProperty(this, config.getProp(), 0);
+                mHal.subscribeProperty(this, config.prop, 0);
             }
         }
-        VehiclePropConfig brightnessProperty = mProperties.get(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS);
+        VehiclePropConfig brightnessProperty = mProperties.get(DISPLAY_BRIGHTNESS);
         if (brightnessProperty != null) {
-            mMaxDisplayBrightness = brightnessProperty.getInt32Maxs(0);
+            mMaxDisplayBrightness = brightnessProperty.areaConfigs.size() > 0
+                    ? brightnessProperty.areaConfigs.get(0).maxInt32Value : 0;
             if (mMaxDisplayBrightness <= 0) {
-                Log.w(CarLog.TAG_POWER, "Max display brightness from vehicle HAL is invald:" +
+                Log.w(CarLog.TAG_POWER, "Max display brightness from vehicle HAL is invalid:" +
                         mMaxDisplayBrightness);
                 mMaxDisplayBrightness = 1;
             }
@@ -278,17 +270,17 @@
     }
 
     @Override
-    public synchronized List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties) {
+    public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
         for (VehiclePropConfig config : allProperties) {
-            switch (config.getProp()) {
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE:
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS:
-                    mProperties.put(config.getProp(), config);
+            switch (config.prop) {
+                case AP_POWER_STATE:
+                case DISPLAY_BRIGHTNESS:
+                    mProperties.put(config.prop, config);
                     break;
             }
         }
-        return new LinkedList<VehiclePropConfig>(mProperties.values());
+        return new LinkedList<>(mProperties.values());
     }
 
     @Override
@@ -297,7 +289,7 @@
         synchronized (this) {
             if (mListener == null) {
                 if (mQueuedEvents == null) {
-                    mQueuedEvents = new LinkedList<VehiclePropValue>();
+                    mQueuedEvents = new LinkedList<>();
                 }
                 mQueuedEvents.addAll(values);
                 return;
@@ -309,20 +301,19 @@
 
     private void dispatchEvents(List<VehiclePropValue> values, PowerEventListener listener) {
         for (VehiclePropValue v : values) {
-            switch (v.getProp()) {
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_AP_POWER_STATE:
-                    listener.onApPowerStateChange(new PowerState(
-                            v.getInt32Values(
-                                VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_STATE),
-                            v.getInt32Values(
-                                VehicleApPowerStateIndex.VEHICLE_AP_POWER_STATE_INDEX_ADDITIONAL)));
+            switch (v.prop) {
+                case AP_POWER_STATE:
+                    int state = v.value.int32Values.get(VehicleApPowerStateIndex.STATE);
+                    int param = v.value.int32Values.get(VehicleApPowerStateIndex.ADDITIONAL);
+                    listener.onApPowerStateChange(new PowerState(state, param));
                     break;
-                case VehicleNetworkConsts.VEHICLE_PROPERTY_DISPLAY_BRIGHTNESS:
+                case DISPLAY_BRIGHTNESS:
                     int maxBrightness;
                     synchronized (this) {
                         maxBrightness = mMaxDisplayBrightness;
                     }
-                    listener.onDisplayBrightnessChange(v.getInt32Values(0) * 100 / maxBrightness);
+                    listener.onDisplayBrightnessChange(
+                            (v.value.int32Values.get(0) * 100) / maxBrightness);
                     break;
             }
         }
diff --git a/service/src/com/android/car/hal/PropertyHalServiceBase.java b/service/src/com/android/car/hal/PropertyHalServiceBase.java
index 79fd626..28dd4c6 100644
--- a/service/src/com/android/car/hal/PropertyHalServiceBase.java
+++ b/service/src/com/android/car/hal/PropertyHalServiceBase.java
@@ -19,20 +19,21 @@
 import static com.android.car.hal.CarPropertyUtils.toVehiclePropValue;
 import static java.lang.Integer.toHexString;
 
+import android.annotation.Nullable;
 import android.car.hardware.CarPropertyConfig;
 import android.car.hardware.CarPropertyValue;
 import android.car.hardware.property.CarPropertyEvent;
-import android.os.ServiceSpecificException;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
 import android.util.Log;
 import android.util.SparseIntArray;
 
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
 import com.android.internal.annotations.GuardedBy;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
@@ -44,7 +45,6 @@
  */
 public abstract class PropertyHalServiceBase extends HalServiceBase {
     private final boolean mDbg;
-    private final SparseIntArray mHalPropToValueType = new SparseIntArray();
     private final ConcurrentHashMap<Integer, CarPropertyConfig<?>> mProps =
             new ConcurrentHashMap<>();
     private final String mTag;
@@ -81,6 +81,10 @@
         return new ArrayList<>(mProps.values());
     }
 
+    /**
+     * Returns property or null if property is not ready yet.
+     */
+    @Nullable
     public CarPropertyValue getProperty(int mgrPropId, int areaId) {
         int halPropId = managerToHalPropId(mgrPropId);
         if (halPropId == NOT_SUPPORTED_PROPERTY) {
@@ -89,14 +93,8 @@
 
         VehiclePropValue value = null;
         try {
-            VehiclePropValue valueRequest = VehiclePropValue.newBuilder()
-                    .setProp(halPropId)
-                    .setZone(areaId)
-                    .setValueType(mHalPropToValueType.get(halPropId))
-                    .build();
-
-            value = mVehicleHal.getVehicleNetwork().getProperty(valueRequest);
-        } catch (ServiceSpecificException e) {
+            value = mVehicleHal.get(halPropId, areaId);
+        } catch (PropertyTimeoutException e) {
             Log.e(CarLog.TAG_PROPERTY, "get, property not ready 0x" + toHexString(halPropId), e);
         }
 
@@ -111,8 +109,8 @@
         }
         VehiclePropValue halProp = toVehiclePropValue(prop, halPropId);
         try {
-            mVehicleHal.getVehicleNetwork().setProperty(halProp);
-        } catch (ServiceSpecificException e) {
+            mVehicleHal.set(halProp);
+        } catch (PropertyTimeoutException e) {
             Log.e(CarLog.TAG_PROPERTY, "set, property not ready 0x" + toHexString(halPropId), e);
             throw new RuntimeException(e);
         }
@@ -148,12 +146,12 @@
     }
 
     @Override
-    public List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties) {
+    public Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
         List<VehiclePropConfig> taken = new LinkedList<>();
 
         for (VehiclePropConfig p : allProperties) {
-            int mgrPropId = halToManagerPropId(p.getProp());
+            int mgrPropId = halToManagerPropId(p.prop);
 
             if (mgrPropId == NOT_SUPPORTED_PROPERTY) {
                 continue;  // The property is not handled by this HAL.
@@ -162,11 +160,10 @@
             CarPropertyConfig config = CarPropertyUtils.toCarPropertyConfig(p, mgrPropId);
 
             taken.add(p);
-            mProps.put(p.getProp(), config);
-            mHalPropToValueType.put(p.getProp(), p.getValueType());
+            mProps.put(p.prop, config);
 
             if (mDbg) {
-                Log.d(mTag, "takeSupportedProperties: " + toHexString(p.getProp()));
+                Log.d(mTag, "takeSupportedProperties: " + toHexString(p.prop));
             }
         }
         return taken;
@@ -180,7 +177,7 @@
         }
         if (listener != null) {
             for (VehiclePropValue v : values) {
-                int prop = v.getProp();
+                int prop = v.prop;
                 int mgrPropId = halToManagerPropId(prop);
 
                 if (mgrPropId == NOT_SUPPORTED_PROPERTY) {
diff --git a/service/src/com/android/car/hal/PropertyTimeoutException.java b/service/src/com/android/car/hal/PropertyTimeoutException.java
new file mode 100644
index 0000000..2d6120d
--- /dev/null
+++ b/service/src/com/android/car/hal/PropertyTimeoutException.java
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+package com.android.car.hal;
+
+import static java.lang.Integer.toHexString;
+
+/**
+ * This exception is raised when IVehicle#get or IVehicle#set returns StatusCode.TRY_AGAIN. This
+ * usually happens during boot-up meaning that Vehicle HAL is not ready to get or set that property.
+ */
+class PropertyTimeoutException extends Exception {
+    PropertyTimeoutException(int property) {
+        super("Property 0x" + toHexString(property) + " is not ready yet.");
+    }
+}
diff --git a/service/src/com/android/car/hal/RadioHalService.java b/service/src/com/android/car/hal/RadioHalService.java
index 68423d0..8cd8687 100644
--- a/service/src/com/android/car/hal/RadioHalService.java
+++ b/service/src/com/android/car/hal/RadioHalService.java
@@ -16,22 +16,23 @@
 
 package com.android.car.hal;
 
+import android.annotation.Nullable;
 import android.car.hardware.radio.CarRadioEvent;
 import android.car.hardware.radio.CarRadioPreset;
-import android.os.ServiceSpecificException;
-import android.util.Log;
 import android.hardware.radio.RadioManager;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehicleRadioConstants;
+import android.util.Log;
 
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehicleValueType;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
 
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-import java.io.PrintWriter;
 
 /**
  * This class exposes the Radio related features in the HAL layer.
@@ -48,7 +49,7 @@
     private RadioListener mListener;
 
     public interface RadioListener {
-        public void onEvent(CarRadioEvent event);
+        void onEvent(CarRadioEvent event);
     }
 
     public RadioHalService(VehicleHal hal) {
@@ -65,9 +66,9 @@
     }
 
     @Override
-    public synchronized List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties) {
-        List<VehiclePropConfig> supported = new LinkedList<VehiclePropConfig>();
+    public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
+        Collection<VehiclePropConfig> supported = new LinkedList<>();
         for (VehiclePropConfig p : allProperties) {
             if (handleRadioProperty(p)) {
                 supported.add(p);
@@ -81,7 +82,7 @@
         if (DBG) {
             Log.d(TAG, "handleHalEvents");
         }
-        RadioHalService.RadioListener radioListener = null;
+        RadioHalService.RadioListener radioListener;
         synchronized (this) {
             radioListener = mListener;
         }
@@ -108,7 +109,7 @@
     public void dump(PrintWriter writer) {
         writer.println("*RadioHal*");
         writer.println("**Supported properties**");
-        writer.println(VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET);
+        writer.println(VehicleProperty.RADIO_PRESET);
         if (mListener != null) {
             writer.println("Hal service registered.");
         }
@@ -121,7 +122,7 @@
         mListener = listener;
 
         // Subscribe to all radio properties.
-        mHal.subscribeProperty(this, VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET, 0);
+        mHal.subscribeProperty(this, VehicleProperty.RADIO_PRESET, 0);
     }
 
     public synchronized void unregisterListener() {
@@ -130,8 +131,8 @@
         }
         mListener = null;
 
-        // Unsubscribe from all propreties.
-        mHal.unsubscribeProperty(this, VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET);
+        // Unsubscribe from all properties.
+        mHal.unsubscribeProperty(this, VehicleProperty.RADIO_PRESET);
     }
 
     public synchronized int getPresetCount() {
@@ -139,6 +140,7 @@
         return mPresetCount;
     }
 
+    @Nullable
     public CarRadioPreset getRadioPreset(int presetNumber) {
         // Check if the preset number is out of range. We should return NULL if that is the case.
         if (DBG) {
@@ -148,30 +150,30 @@
             throw new IllegalArgumentException("Preset number not valid: " + presetNumber);
         }
 
-        int[] presetArray = {presetNumber, 0, 0, 0};
-        VehiclePropValue presetNumberValue =
-            VehiclePropValueUtil.createIntVectorValue(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET, presetArray, 0);
+        VehiclePropValue presetNumberValue = new VehiclePropValue();
+        presetNumberValue.prop = VehicleProperty.RADIO_PRESET;
+        presetNumberValue.value.int32Values.addAll(Arrays.asList(presetNumber, 0, 0, 0));
 
         VehiclePropValue presetConfig;
         try {
-            presetConfig = mHal.getVehicleNetwork().getProperty(presetNumberValue);
-        } catch (ServiceSpecificException e) {
-            Log.e(TAG, "property VEHICLE_PROPERTY_RADIO_PRESET not ready");
+            presetConfig = mHal.get(presetNumberValue);
+        } catch (PropertyTimeoutException e) {
+            Log.e(TAG, "property VehicleProperty.RADIO_PRESET not ready", e);
             return null;
         }
         // Sanity check the output from HAL.
-        if (presetConfig.getInt32ValuesCount() != 4) {
+        if (presetConfig.value.int32Values.size() != 4) {
             Log.e(TAG, "Return value does not have 4 elements: " +
-                presetConfig.getInt32ValuesList());
+                Arrays.toString(presetConfig.value.int32Values.toArray()));
             throw new IllegalStateException(
-                "Invalid preset returned from service: " + presetConfig.getInt32ValuesList());
+                "Invalid preset returned from service: "
+                        + Arrays.toString(presetConfig.value.int32Values.toArray()));
         }
 
-        int retPresetNumber = presetConfig.getInt32Values(0);
-        int retBand = presetConfig.getInt32Values(1);
-        int retChannel = presetConfig.getInt32Values(2);
-        int retSubChannel = presetConfig.getInt32Values(3);
+        int retPresetNumber = presetConfig.value.int32Values.get(0);
+        int retBand = presetConfig.value.int32Values.get(1);
+        int retChannel = presetConfig.value.int32Values.get(2);
+        int retSubChannel = presetConfig.value.int32Values.get(3);
         if (retPresetNumber != presetNumber) {
             Log.e(TAG, "Preset number is not the same: " + presetNumber + " vs " + retPresetNumber);
             return null;
@@ -197,18 +199,13 @@
             return false;
         }
 
-        VehiclePropValue setPresetValue =
-            VehiclePropValueUtil.createBuilder(
-                VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET,
-                VehicleValueType.VEHICLE_VALUE_TYPE_INT32_VEC4, 0)
-            .addInt32Values(preset.getPresetNumber())
-            .addInt32Values(preset.getBand())
-            .addInt32Values(preset.getChannel())
-            .addInt32Values(preset.getSubChannel())
-            .build();
         try {
-            mHal.getVehicleNetwork().setProperty(setPresetValue);
-        } catch (ServiceSpecificException e) {
+            mHal.set(VehicleProperty.RADIO_PRESET).to(new int[] {
+                    preset.getPresetNumber(),
+                    preset.getBand(),
+                    preset.getChannel(),
+                    preset.getSubChannel()});
+        } catch (PropertyTimeoutException e) {
             Log.e(CarLog.TAG_POWER, "cannot set to RADIO_PRESET", e);
             return false;
         }
@@ -217,7 +214,7 @@
 
     private boolean isValidPresetNumber(int presetNumber) {
         // Check for preset number.
-        if (presetNumber < VehicleNetworkConsts.VehicleRadioConsts.VEHICLE_RADIO_PRESET_MIN_VALUE
+        if (presetNumber < VehicleRadioConstants.VEHICLE_RADIO_PRESET_MIN_VALUE
             || presetNumber > mPresetCount) {
             Log.e(TAG, "Preset number not in range (1, " + mPresetCount + ") - " + presetNumber);
             return false;
@@ -238,10 +235,10 @@
     }
 
     private boolean handleRadioProperty(VehiclePropConfig property) {
-        switch (property.getProp()) {
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET:
+        switch (property.prop) {
+            case VehicleProperty.RADIO_PRESET:
                 // Extract the count of presets.
-                mPresetCount = property.getConfigArray(0);
+                mPresetCount = property.configArray.get(0);
                 Log.d(TAG, "Read presets count: " + mPresetCount);
                 return true;
             default:
@@ -251,15 +248,16 @@
     }
 
     private CarRadioEvent createCarRadioEvent(VehiclePropValue v) {
-        switch (v.getProp()) {
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_RADIO_PRESET:
-                if (v.getInt32ValuesCount() != 4) {
-                    Log.e(TAG, "Returned a wrong array size: " + v.getInt32ValuesCount());
+        switch (v.prop) {
+            case VehicleProperty.RADIO_PRESET:
+                int vecSize = v.value.int32Values.size();
+                if (vecSize != 4) {
+                    Log.e(TAG, "Returned a wrong array size: " + vecSize);
                     return null;
                 }
 
                 Integer intValues[] = new Integer[4];
-                v.getInt32ValuesList().toArray(intValues);
+                v.value.int32Values.toArray(intValues);
 
                 // Verify the correctness of the values.
                 if (!isValidPresetNumber(intValues[0]) && !isValidBand(intValues[1])) {
diff --git a/service/src/com/android/car/hal/SensorHalService.java b/service/src/com/android/car/hal/SensorHalService.java
index c21bddd..d2c2714 100644
--- a/service/src/com/android/car/hal/SensorHalService.java
+++ b/service/src/com/android/car/hal/SensorHalService.java
@@ -16,21 +16,30 @@
 
 package com.android.car.hal;
 
+import static android.hardware.vehicle.V2_0.VehicleProperty.DRIVING_STATUS;
+import static android.hardware.vehicle.V2_0.VehicleProperty.FUEL_LEVEL_LOW;
+import static android.hardware.vehicle.V2_0.VehicleProperty.GEAR_SELECTION;
+import static android.hardware.vehicle.V2_0.VehicleProperty.NIGHT_MODE;
+import static android.hardware.vehicle.V2_0.VehicleProperty.PARKING_BRAKE_ON;
+import static android.hardware.vehicle.V2_0.VehicleProperty.PERF_VEHICLE_SPEED;
+import static java.lang.Integer.toHexString;
+
+import android.annotation.Nullable;
 import android.car.hardware.CarSensorEvent;
 import android.car.hardware.CarSensorManager;
-import android.os.ServiceSpecificException;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehicleProperty;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
 import android.util.Log;
 import android.util.SparseArray;
 
 import com.android.car.CarLog;
 import com.android.car.CarSensorEventFactory;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
 
 import java.io.PrintWriter;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -41,13 +50,12 @@
 
     private static final boolean DBG_EVENTS = false;
 
-    private static final int SENSOR_TYPE_INVALD = -1;
+    private static final int SENSOR_TYPE_INVALID = -1;
 
     private final VehicleHal mHal;
     private boolean mIsReady = false;
     private SensorHalServiceBase.SensorListener mSensorListener;
-    private final SparseArray<VehiclePropConfig> mSensorToHalProperty =
-            new SparseArray<VehiclePropConfig>();
+    private final SparseArray<VehiclePropConfig> mSensorToHalProperty = new SparseArray<>();
 
     public SensorHalService(VehicleHal hal) {
         mHal = hal;
@@ -59,17 +67,14 @@
     }
 
     @Override
-    public synchronized List<VehiclePropConfig> takeSupportedProperties(
-            List<VehiclePropConfig> allProperties) {
-        LinkedList<VehiclePropConfig> supportedProperties = new LinkedList<VehiclePropConfig>();
+    public synchronized Collection<VehiclePropConfig> takeSupportedProperties(
+            Collection<VehiclePropConfig> allProperties) {
+        LinkedList<VehiclePropConfig> supportedProperties = new LinkedList<>();
         for (VehiclePropConfig halProperty : allProperties) {
-            int sensor = getSensorTypeFromHalProperty(halProperty.getProp());
-            if (sensor != SENSOR_TYPE_INVALD &&
-                halProperty.getChangeMode() !=
-                    VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC &&
-                (halProperty.getAccess() == VehiclePropAccess.VEHICLE_PROP_ACCESS_READ
-                    || halProperty.getAccess() ==
-                    VehiclePropAccess.VEHICLE_PROP_ACCESS_WRITE)) {
+            int sensor = getSensorTypeFromHalProperty(halProperty.prop);
+            if (sensor != SENSOR_TYPE_INVALID
+                    && halProperty.changeMode != VehiclePropertyChangeMode.STATIC
+                    && ((halProperty.access & VehiclePropertyAccess.READ) != 0)) {
                 supportedProperties.add(halProperty);
                 mSensorToHalProperty.append(sensor, halProperty);
             }
@@ -83,8 +88,8 @@
         mIsReady = false;
     }
 
-    // should be used only insidehandleHalEvents.
-    private final LinkedList<CarSensorEvent> mEventsToDispatch = new LinkedList<CarSensorEvent>();
+    // Should be used only inside handleHalEvents method.
+    private final LinkedList<CarSensorEvent> mEventsToDispatch = new LinkedList<>();
     @Override
     public void handleHalEvents(List<VehiclePropValue> values) {
         for (VehiclePropValue v : values) {
@@ -104,42 +109,42 @@
     }
 
     private CarSensorEvent createCarSensorEvent(VehiclePropValue v) {
-        int property = v.getProp();
+        int property = v.prop;
         int sensorType = getSensorTypeFromHalProperty(property);
-        if (sensorType == SENSOR_TYPE_INVALD) {
+        if (sensorType == SENSOR_TYPE_INVALID) {
             throw new RuntimeException("handleBooleanHalEvent no sensor defined for property " +
                     property);
         }
         switch (property) {
             // boolean
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE:
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_PARKING_BRAKE_ON:
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_FUEL_LEVEL_LOW: {
+            case VehicleProperty.NIGHT_MODE:
+            case VehicleProperty.PARKING_BRAKE_ON:
+            case VehicleProperty.FUEL_LEVEL_LOW: {
                 if (DBG_EVENTS) {
                     Log.i(CarLog.TAG_SENSOR, "boolean event, property:" +
-                            Integer.toHexString(property) + " value:" + v.getInt32Values(0));
+                            toHexString(property) + " value:" + v.value.int32Values.get(0));
                 }
-                return CarSensorEventFactory.createBooleanEvent(sensorType, v.getTimestamp(),
-                        v.getInt32Values(0) == 1);
+                return CarSensorEventFactory.createBooleanEvent(sensorType, v.timestamp,
+                        v.value.int32Values.get(0) == 1);
             }
             // int
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_GEAR_SELECTION:
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS: {
+            case VehicleProperty.GEAR_SELECTION:
+            case VehicleProperty.DRIVING_STATUS: {
                 if (DBG_EVENTS) {
                     Log.i(CarLog.TAG_SENSOR, "int event, property:" +
-                            Integer.toHexString(property) + " value:" + v.getInt32Values(0));
+                            toHexString(property) + " value:" + v.value.int32Values.get(0));
                 }
-                return CarSensorEventFactory.createIntEvent(sensorType, v.getTimestamp(),
-                        v.getInt32Values(0));
+                return CarSensorEventFactory.createIntEvent(sensorType, v.timestamp,
+                        v.value.int32Values.get(0));
             }
             // float
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_PERF_VEHICLE_SPEED: {
+            case VehicleProperty.PERF_VEHICLE_SPEED: {
                 if (DBG_EVENTS) {
                     Log.i(CarLog.TAG_SENSOR, "float event, property:" +
-                            Integer.toHexString(property) + " value:" + v.getFloatValues(0));
+                            toHexString(property) + " value:" + v.value.floatValues.get(0));
                 }
-                return CarSensorEventFactory.createFloatEvent(sensorType, v.getTimestamp(),
-                        v.getFloatValues(0));
+                return CarSensorEventFactory.createFloatEvent(sensorType, v.timestamp,
+                        v.value.floatValues.get(0));
             }
         }
         return null;
@@ -171,10 +176,11 @@
             return false;
         }
         //TODO calculate sampling rate properly, bug: 32095903
-        mHal.subscribeProperty(this, config.getProp(), fixSamplingRateForProperty(config, rate));
+        mHal.subscribeProperty(this, config.prop, fixSamplingRateForProperty(config, rate));
         return true;
     }
 
+    @Nullable
     public CarSensorEvent getCurrentSensorValue(int sensorType) {
         VehiclePropConfig config;
         synchronized (this) {
@@ -182,23 +188,22 @@
         }
         if (config == null) {
             Log.e(CarLog.TAG_SENSOR, "sensor type not available 0x" +
-                    Integer.toHexString(sensorType));
+                    toHexString(sensorType));
             return null;
         }
         try {
-            VehiclePropValue value = mHal.getVehicleNetwork().getProperty(config.getProp());
+            VehiclePropValue value = mHal.get(config.prop);
             return createCarSensorEvent(value);
-        } catch (ServiceSpecificException e) {
-            Log.e(CarLog.TAG_SENSOR, "property not ready 0x" +
-                    Integer.toHexString(config.getProp()), e);
+        } catch (PropertyTimeoutException e) {
+            Log.e(CarLog.TAG_SENSOR, "property not ready 0x" + toHexString(config.prop), e);
             return null;
         }
     }
 
     private float fixSamplingRateForProperty(VehiclePropConfig prop, int carSensorManagerRate) {
-        switch (prop.getChangeMode()) {
-            case VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_CHANGE:
-            case VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_ON_SET:
+        switch (prop.changeMode) {
+            case VehiclePropertyChangeMode.ON_CHANGE:
+            case VehiclePropertyChangeMode.ON_SET:
                 return 0;
         }
         float rate = 1.0f;
@@ -213,11 +218,11 @@
             default: // fall back to default.
                 break;
         }
-        if (rate > prop.getSampleRateMax()) {
-            rate = prop.getSampleRateMax();
+        if (rate > prop.maxSampleRate) {
+            rate = prop.maxSampleRate;
         }
-        if (rate < prop.getSampleRateMin()) {
-            rate = prop.getSampleRateMin();
+        if (rate < prop.minSampleRate) {
+            rate = prop.minSampleRate;
         }
         return rate;
     }
@@ -228,7 +233,7 @@
         if (config == null) {
             return;
         }
-        mHal.unsubscribeProperty(this, config.getProp());
+        mHal.unsubscribeProperty(this, config.prop);
     }
 
     /**
@@ -239,20 +244,20 @@
      */
     static int getSensorTypeFromHalProperty(int halPropertyType) {
         switch (halPropertyType) {
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_PERF_VEHICLE_SPEED:
+            case PERF_VEHICLE_SPEED:
                 return CarSensorManager.SENSOR_TYPE_CAR_SPEED;
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_GEAR_SELECTION:
+            case GEAR_SELECTION:
                 return CarSensorManager.SENSOR_TYPE_GEAR;
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_NIGHT_MODE:
+            case NIGHT_MODE:
                 return CarSensorManager.SENSOR_TYPE_NIGHT;
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_PARKING_BRAKE_ON:
+            case PARKING_BRAKE_ON:
                 return CarSensorManager.SENSOR_TYPE_PARKING_BRAKE;
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_DRIVING_STATUS:
+            case DRIVING_STATUS:
                 return CarSensorManager.SENSOR_TYPE_DRIVING_STATUS;
-            case VehicleNetworkConsts.VEHICLE_PROPERTY_FUEL_LEVEL_LOW:
+            case FUEL_LEVEL_LOW:
                 return CarSensorManager.SENSOR_TYPE_FUEL_LEVEL;
             default:
-                return SENSOR_TYPE_INVALD;
+                return SENSOR_TYPE_INVALID;
         }
     }
 
diff --git a/service/src/com/android/car/hal/SensorHalServiceBase.java b/service/src/com/android/car/hal/SensorHalServiceBase.java
index ab4dd6a..bf47f7b 100644
--- a/service/src/com/android/car/hal/SensorHalServiceBase.java
+++ b/service/src/com/android/car/hal/SensorHalServiceBase.java
@@ -17,11 +17,10 @@
 package com.android.car.hal;
 
 import android.car.hardware.CarSensorEvent;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
 
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-
-import java.io.PrintWriter;
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 
@@ -44,7 +43,7 @@
         void onSensorEvents(List<CarSensorEvent> events);
     }
 
-    private final LinkedList<CarSensorEvent> mDispatchQ = new LinkedList<CarSensorEvent>();
+    private final LinkedList<CarSensorEvent> mDispatchQ = new LinkedList<>();
 
     public abstract void registerSensorListener(SensorListener listener);
 
@@ -83,9 +82,4 @@
         // sensor provider.
         throw new RuntimeException("should not be called");
     }
-
-    @Override
-    public List<VehiclePropConfig> takeSupportedProperties(List<VehiclePropConfig> allProperties) {
-        return null;
-    }
 }
diff --git a/service/src/com/android/car/hal/VehicleHal.java b/service/src/com/android/car/hal/VehicleHal.java
index 7c8d7be..182583d 100644
--- a/service/src/com/android/car/hal/VehicleHal.java
+++ b/service/src/com/android/car/hal/VehicleHal.java
@@ -16,6 +16,19 @@
 
 package com.android.car.hal;
 
+import static com.android.car.CarServiceUtils.toByteArray;
+import static com.android.car.CarServiceUtils.toFloatArray;
+import static com.android.car.CarServiceUtils.toIntArray;
+import static java.lang.Integer.toHexString;
+
+import android.annotation.CheckResult;
+import android.hardware.vehicle.V2_0.IVehicle;
+import android.hardware.vehicle.V2_0.IVehicleCallback;
+import android.hardware.vehicle.V2_0.VehicleAreaConfig;
+import android.hardware.vehicle.V2_0.VehiclePropConfig;
+import android.hardware.vehicle.V2_0.VehiclePropValue;
+import android.hardware.vehicle.V2_0.VehiclePropertyAccess;
+import android.hardware.vehicle.V2_0.VehiclePropertyChangeMode;
 import android.os.HandlerThread;
 import android.os.SystemClock;
 import android.util.ArraySet;
@@ -23,23 +36,17 @@
 import android.util.SparseArray;
 
 import com.android.car.CarLog;
-import com.android.car.vehiclenetwork.VehicleNetwork;
-import com.android.car.vehiclenetwork.VehicleNetwork.VehicleNetworkListener;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropAccess;
-import com.android.car.vehiclenetwork.VehicleNetworkConsts.VehiclePropChangeMode;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfig;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropConfigs;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValue;
-import com.android.car.vehiclenetwork.VehicleNetworkProto.VehiclePropValues;
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.PrintWriter;
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.LinkedList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 /**
  * Abstraction for vehicle HAL. This class handles interface with native HAL and do basic parsing
@@ -47,39 +54,13 @@
  * implementation. It is responsibility of {@link HalServiceBase} to convert data to corresponding
  * Car*Service for Car*Manager API.
  */
-public class VehicleHal implements VehicleNetworkListener {
+public class VehicleHal extends IVehicleCallback.Stub {
 
     private static final boolean DBG = false;
 
-    static {
-        createInstance();
-    }
-
-    private static VehicleHal sInstance;
-
-    public static synchronized VehicleHal getInstance() {
-        if (sInstance == null) {
-            createInstance();
-        }
-        return sInstance;
-    }
-
-    private static synchronized void createInstance() {
-        sInstance = new VehicleHal();
-        // init is handled in a separate thread to prevent blocking the calling thread for too
-        // long.
-        sInstance.init();
-    }
-
-    public static synchronized void releaseInstance() {
-        if (sInstance != null) {
-            sInstance.release();
-            sInstance = null;
-        }
-    }
+    private static final int NO_AREA = -1;
 
     private final HandlerThread mHandlerThread;
-    private final VehicleNetwork mVehicleNetwork;
     private final SensorHalService mSensorHal;
     private final InfoHalService mInfoHal;
     private final AudioHalService mAudioHal;
@@ -89,16 +70,17 @@
     private final HvacHalService mHvacHal;
     private final InputHalService mInputHal;
     private final VendorExtensionHalService mVendorExtensionHal;
+    private final HalClient mHalClient;
 
     /** stores handler for each HAL property. Property events are sent to handler. */
-    private final SparseArray<HalServiceBase> mPropertyHandlers = new SparseArray<HalServiceBase>();
+    private final SparseArray<HalServiceBase> mPropertyHandlers = new SparseArray<>();
     /** This is for iterating all HalServices with fixed order. */
     private final HalServiceBase[] mAllServices;
-    private final ArraySet<Integer> mSubscribedProperties = new ArraySet<Integer>();
+    private final ArraySet<Integer> mSubscribedProperties = new ArraySet<>();
     private final HashMap<Integer, VehiclePropConfig> mAllProperties = new HashMap<>();
     private final HashMap<Integer, VehiclePropertyEventInfo> mEventLog = new HashMap<>();
 
-    private VehicleHal() {
+    public VehicleHal(IVehicle vehicle) {
         mHandlerThread = new HandlerThread("VEHICLE-HAL");
         mHandlerThread.start();
         // passing this should be safe as long as it is just kept and not used in constructor
@@ -109,7 +91,7 @@
         mCabinHal = new CabinHalService(this);
         mRadioHal = new RadioHalService(this);
         mHvacHal = new HvacHalService(this);
-        mInputHal = new InputHalService();
+        mInputHal = new InputHalService(this);
         mVendorExtensionHal = new VendorExtensionHalService(this);
         mAllServices = new HalServiceBase[] {
                 mPowerHal,
@@ -122,14 +104,15 @@
                 mInputHal,
                 mVendorExtensionHal
                 };
-        mVehicleNetwork = VehicleNetwork.createVehicleNetwork(this, mHandlerThread.getLooper());
+
+        mHalClient = new HalClient(vehicle, mHandlerThread.getLooper(), this /*IVehicleCallback*/);
     }
 
     /** Dummy version only for testing */
     @VisibleForTesting
     public VehicleHal(PowerHalService powerHal, SensorHalService sensorHal, InfoHalService infoHal,
             AudioHalService audioHal, CabinHalService cabinHal, RadioHalService radioHal,
-            HvacHalService hvacHal, VehicleNetwork vehicleNetwork) {
+            HvacHalService hvacHal, HalClient halClient) {
         mHandlerThread = null;
         mPowerHal = powerHal;
         mSensorHal = sensorHal;
@@ -141,24 +124,21 @@
         mInputHal = null;
         mVendorExtensionHal = null;
         mAllServices = null;
-        mVehicleNetwork = vehicleNetwork;
+        mHalClient = halClient;
     }
 
     public void init() {
-        VehiclePropConfigs properties = mVehicleNetwork.listProperties();
-        // needs copy as getConfigsList gives unmodifiable one.
-        List<VehiclePropConfig> propertiesList =
-                new LinkedList<VehiclePropConfig>(properties.getConfigsList());
+        Set<VehiclePropConfig> properties = new HashSet<>(mHalClient.getAllPropConfigs());
 
         synchronized (this) {
             // Create map of all properties
-            for (VehiclePropConfig p : propertiesList) {
-                mAllProperties.put(p.getProp(), p);
+            for (VehiclePropConfig p : properties) {
+                mAllProperties.put(p.prop, p);
             }
         }
 
         for (HalServiceBase service: mAllServices) {
-            List<VehiclePropConfig> taken = service.takeSupportedProperties(propertiesList);
+            Collection<VehiclePropConfig> taken = service.takeSupportedProperties(properties);
             if (taken == null) {
                 continue;
             }
@@ -167,10 +147,10 @@
             }
             synchronized (this) {
                 for (VehiclePropConfig p: taken) {
-                    mPropertyHandlers.append(p.getProp(), service);
+                    mPropertyHandlers.append(p.prop, service);
                 }
             }
-            propertiesList.removeAll(taken);
+            properties.removeAll(taken);
             service.init();
         }
     }
@@ -182,7 +162,7 @@
         }
         synchronized (this) {
             for (int p : mSubscribedProperties) {
-                mVehicleNetwork.unsubscribe(p);
+                mHalClient.unsubscribe(p);
             }
             mSubscribedProperties.clear();
             mAllProperties.clear();
@@ -228,19 +208,20 @@
 
     private void assertServiceOwnerLocked(HalServiceBase service, int property) {
         if (service != mPropertyHandlers.get(property)) {
-            throw new IllegalArgumentException("Property 0x" + Integer.toHexString(property)
+            throw new IllegalArgumentException("Property 0x" + toHexString(property)
                     + " is not owned by service: " + service);
         }
     }
 
     /**
      * Subscribe given property. Only Hal service owning the property can subscribe it.
-     * @param service
-     * @param property
-     * @param samplingRateHz
      */
     public void subscribeProperty(HalServiceBase service, int property,
             float samplingRateHz) throws IllegalArgumentException {
+        if (DBG) {
+            Log.i(CarLog.TAG_HAL, "subscribeProperty, service:" + service
+                    + ", property: 0x" + toHexString(property));
+        }
         VehiclePropConfig config;
         synchronized (this) {
             config = mAllProperties.get(property);
@@ -254,13 +235,17 @@
                 assertServiceOwnerLocked(service, property);
                 mSubscribedProperties.add(property);
             }
-            mVehicleNetwork.subscribe(property, samplingRateHz);
+            mHalClient.subscribe(property, samplingRateHz);
         } else {
             Log.e(CarLog.TAG_HAL, "Cannot subscribe to property: " + property);
         }
     }
 
     public void unsubscribeProperty(HalServiceBase service, int property) {
+        if (DBG) {
+            Log.i(CarLog.TAG_HAL, "unsubscribeProperty, service:" + service
+                    + ", property: 0x" + toHexString(property));
+        }
         VehiclePropConfig config;
         synchronized (this) {
             config = mAllProperties.get(property);
@@ -273,45 +258,116 @@
                 assertServiceOwnerLocked(service, property);
                 mSubscribedProperties.remove(property);
             }
-            mVehicleNetwork.unsubscribe(property);
+            mHalClient.unsubscribe(property);
         } else {
             Log.e(CarLog.TAG_HAL, "Cannot unsubscribe property: " + property);
         }
     }
 
-    public VehicleNetwork getVehicleNetwork() {
-        return mVehicleNetwork;
+    public boolean isPropertySupported(int propertyId) {
+        return mAllProperties.containsKey(propertyId);
     }
 
-    public static boolean isPropertySubscribable(VehiclePropConfig config) {
-        if ((config.getAccess() & VehiclePropAccess.VEHICLE_PROP_ACCESS_READ) == 0 ||
-                (config.getChangeMode() ==
-                VehiclePropChangeMode.VEHICLE_PROP_CHANGE_MODE_STATIC)) {
+    public Collection<VehiclePropConfig> getAllPropConfigs() {
+        return mAllProperties.values();
+    }
+
+    public VehiclePropValue get(int propertyId) throws PropertyTimeoutException {
+        return get(propertyId, NO_AREA);
+    }
+
+    public VehiclePropValue get(int propertyId, int areaId) throws PropertyTimeoutException {
+        Log.i(CarLog.TAG_HAL, "get, property: 0x" + toHexString(propertyId)
+                + ", areaId: 0x" + toHexString(areaId));
+        VehiclePropValue propValue = new VehiclePropValue();
+        propValue.prop = propertyId;
+        propValue.areaId = areaId;
+        return mHalClient.getValue(propValue);
+    }
+
+    public <T> T get(Class clazz, int propertyId) throws PropertyTimeoutException {
+        return get(clazz, createPropValue(propertyId, NO_AREA));
+    }
+
+    public <T> T get(Class clazz, int propertyId, int areaId) throws PropertyTimeoutException {
+        return get(clazz, createPropValue(propertyId, areaId));
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T> T get(Class clazz, VehiclePropValue requestedPropValue)
+            throws PropertyTimeoutException {
+        VehiclePropValue propValue = mHalClient.getValue(requestedPropValue);
+        if (clazz == Integer.class || clazz == int.class) {
+            return (T) propValue.value.int32Values.get(0);
+        } else if (clazz == Boolean.class || clazz == boolean.class) {
+            return (T) Boolean.valueOf(propValue.value.int32Values.get(0) == 1);
+        } else if (clazz == Float.class || clazz == float.class) {
+            return (T) propValue.value.floatValues.get(0);
+        } else if (clazz == Integer[].class) {
+            Integer[] intArray = new Integer[propValue.value.int32Values.size()];
+            return (T) propValue.value.int32Values.toArray(intArray);
+        } else if (clazz == Float[].class) {
+            Float[] floatArray = new Float[propValue.value.floatValues.size()];
+            return (T) propValue.value.floatValues.toArray(floatArray);
+        } else if (clazz == int[].class) {
+            return (T) toIntArray(propValue.value.int32Values);
+        } else if (clazz == float[].class) {
+            return (T) toFloatArray(propValue.value.floatValues);
+        } else if (clazz == byte[].class) {
+            return (T) toByteArray(propValue.value.bytes);
+        } else if (clazz == String.class) {
+            return (T) propValue.value.stringValue;
+        } else {
+            throw new IllegalArgumentException("Unexpected type: " + clazz);
+        }
+    }
+
+    public VehiclePropValue get(VehiclePropValue requestedPropValue)
+            throws PropertyTimeoutException {
+        return mHalClient.getValue(requestedPropValue);
+    }
+
+    void set(VehiclePropValue propValue) throws PropertyTimeoutException {
+        mHalClient.setValue(propValue);
+    }
+
+    @CheckResult
+    VehiclePropValueSetter set(int propId) {
+        return new VehiclePropValueSetter(mHalClient, propId, NO_AREA);
+    }
+
+    @CheckResult
+    VehiclePropValueSetter set(int propId, int areaId) {
+        return new VehiclePropValueSetter(mHalClient, propId, areaId);
+    }
+
+    static boolean isPropertySubscribable(VehiclePropConfig config) {
+        if ((config.access & VehiclePropertyAccess.READ) == 0 ||
+                (config.changeMode == VehiclePropertyChangeMode.STATIC)) {
             return false;
         }
         return true;
     }
 
-    public static void dumpProperties(PrintWriter writer, Collection<VehiclePropConfig> configs) {
+    static void dumpProperties(PrintWriter writer, Collection<VehiclePropConfig> configs) {
         for (VehiclePropConfig config : configs) {
-            writer.println("property " +
-                    VehicleNetworkConsts.getVehiclePropertyName(config.getProp()));
+            writer.println(String.format("property 0x%x", config.prop));
         }
     }
 
-    private final ArraySet<HalServiceBase> mServicesToDispatch = new ArraySet<HalServiceBase>();
+    private final ArraySet<HalServiceBase> mServicesToDispatch = new ArraySet<>();
 
     @Override
-    public void onVehicleNetworkEvents(VehiclePropValues values) {
+    public void onPropertyEvent(ArrayList<VehiclePropValue> propValues) {
         synchronized (this) {
-            for (VehiclePropValue v : values.getValuesList()) {
-                HalServiceBase service = mPropertyHandlers.get(v.getProp());
+            for (VehiclePropValue v : propValues) {
+                HalServiceBase service = mPropertyHandlers.get(v.prop);
                 service.getDispatchList().add(v);
                 mServicesToDispatch.add(service);
-                VehiclePropertyEventInfo info = mEventLog.get(v.getProp());
+                VehiclePropertyEventInfo info = mEventLog.get(v.prop);
                 if (info == null) {
                     info = new VehiclePropertyEventInfo(v);
-                    mEventLog.put(v.getProp(), info);
+                    mEventLog.put(v.prop, info);
                 } else {
                     info.addNewEvent(v);
                 }
@@ -330,19 +386,12 @@
     }
 
     @Override
-    public void onHalError(int errorCode, int property, int operation) {
-        Log.e(CarLog.TAG_HAL, "onHalError, errorCode:" + errorCode +
-                " property:0x" + Integer.toHexString(property) +
-                " operation:" + operation);
+    public void onPropertySetError(int errorCode, int propId, int areaId) {
+        Log.e(CarLog.TAG_HAL, String.format("onPropertySetError, errorCode: %d, prop: 0x%x, "
+                + "area: 0x%x", errorCode, propId, areaId));
         // TODO propagate per property error to HAL services and handle global error, bug:32068464
     }
 
-    @Override
-    public void onHalRestart(boolean inMocking) {
-        Log.e(CarLog.TAG_HAL, "onHalRestart, inMocking:" + inMocking);
-        // TODO restart things as other components started mocking. For now, ignore., bug:32068464
-    }
-
     public void dump(PrintWriter writer) {
         writer.println("**dump HAL services**");
         for (HalServiceBase service: mAllServices) {
@@ -354,30 +403,26 @@
             configList = new ArrayList<>(mAllProperties.values());
         }
 
+
         writer.println("**All properties**");
         for (VehiclePropConfig config : configList) {
-            StringBuilder builder = new StringBuilder();
-            builder.append("Property:0x").append(Integer.toHexString(config.getProp()));
-            builder.append(",access:0x" + Integer.toHexString(config.getAccess()));
-            builder.append(",changeMode:0x" + Integer.toHexString(config.getChangeMode()));
-            builder.append(",valueType:0x" + Integer.toHexString(config.getValueType()));
-            builder.append(",permission:0x" + Integer.toHexString(config.getPermissionModel()));
-            builder.append(",zone:0x" + Integer.toHexString(
-                config.hasZones() ? config.getZones() : 0));
-            builder.append(",config:0x" + Integer.toHexString(config.getConfigArray(0)));
-            builder.append(",fs min:" + config.getSampleRateMin());
-            builder.append(",fs max:").append(config.getSampleRateMax());
-            for (int i = 0; i < config.getFloatMaxsCount(); i++) {
-                builder.append(",v min:" + config.getFloatMins(i));
-                builder.append(",v max:" + config.getFloatMaxs(i));
-            }
-            for (int i = 0; i < config.getInt32MaxsCount(); i++) {
-                builder.append(",v min:" + config.getInt32Mins(i));
-                builder.append(",v max:" + config.getInt32Maxs(i));
-            }
-            for (int i = 0; i < config.getInt64MaxsCount(); i++) {
-                builder.append(",v min:" + config.getInt64Mins(i));
-                builder.append(",v max:" + config.getInt64Maxs(i));
+            StringBuilder builder = new StringBuilder()
+                    .append("Property:0x").append(toHexString(config.prop))
+                    .append(",access:0x").append(toHexString(config.access))
+                    .append(",changeMode:0x").append(toHexString(config.changeMode))
+                    .append(",permission:0x").append(toHexString(config.permissionModel))
+                    .append(",areas:0x").append(toHexString(config.supportedAreas))
+                    .append(",config:0x").append(Arrays.toString(config.configArray.toArray()))
+                    .append(",fs min:").append(config.minSampleRate)
+                    .append(",fs max:").append(config.maxSampleRate);
+            for (VehicleAreaConfig area : config.areaConfigs) {
+                builder.append(",areaId :").append(toHexString(area.areaId))
+                        .append(",f min:").append(area.minFloatValue)
+                        .append(",f max:").append(area.maxFloatValue)
+                        .append(",i min:").append(area.minInt32Value)
+                        .append(",i max:").append(area.maxInt32Value)
+                        .append(",i64 min:").append(area.minInt64Value)
+                        .append(",i64 max:").append(area.maxInt64Value);
             }
             writer.println(builder.toString());
         }
@@ -396,35 +441,6 @@
         }
     }
 
-    public static String dumpVehiclePropValue(VehiclePropValue value) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("Property:0x" + Integer.toHexString(value.getProp()));
-        sb.append(",timestamp:" + value.getTimestamp());
-        sb.append(",value type:0x" + Integer.toHexString(value.getValueType()));
-        sb.append(",zone:0x" + Integer.toHexString(value.getZone()));
-        if (value.getInt32ValuesCount() > 0) {
-            sb.append(",int32 values:");
-            for (int i = 0; i < value.getInt32ValuesCount(); i++) {
-                sb.append("," + value.getInt32Values(i));
-            }
-        }
-        if (value.hasInt64Value()) {
-            sb.append(",int64 value:" + value.getInt64Value());
-        }
-        if (value.getFloatValuesCount() > 0) {
-            sb.append(",float values:");
-            for (int i = 0; i < value.getFloatValuesCount(); i++) {
-                sb.append("," + value.getFloatValues(i));
-            }
-        }
-        if (value.hasStringValue()) {
-            sb.append(",string value:" + value.getStringValue());
-        }
-        if (value.hasBytesValue()) {
-            sb.append(",bytes value:" + value.getBytesValue());
-        }
-        return sb.toString();
-    }
     private static class VehiclePropertyEventInfo {
         private int eventCount;
         private VehiclePropValue lastEvent;
@@ -439,4 +455,76 @@
             lastEvent = event;
         }
     }
+
+    final class VehiclePropValueSetter {
+        final WeakReference<HalClient> mClient;
+        final VehiclePropValue mPropValue;
+
+        private VehiclePropValueSetter(HalClient client, int propId, int areaId) {
+            mClient = new WeakReference<>(client);
+            mPropValue = new VehiclePropValue();
+            mPropValue.prop = propId;
+            mPropValue.areaId = areaId;
+        }
+
+        void to(boolean value) throws PropertyTimeoutException {
+            to(value ? 1 : 0);
+        }
+
+        void to(int value) throws PropertyTimeoutException {
+            mPropValue.value.int32Values.add(value);
+            submit();
+        }
+
+        void to(int[] values) throws PropertyTimeoutException {
+            for (int value : values) {
+                mPropValue.value.int32Values.add(value);
+            }
+            submit();
+        }
+
+        void to(Collection<Integer> values) throws PropertyTimeoutException {
+            mPropValue.value.int32Values.addAll(values);
+            submit();
+        }
+
+        void submit() throws PropertyTimeoutException {
+            HalClient client =  mClient.get();
+            if (client != null) {
+                Log.i(CarLog.TAG_HAL, "set, property: 0x" + toHexString(mPropValue.prop)
+                        + ", areaId: 0x" + toHexString(mPropValue.areaId));
+                client.setValue(mPropValue);
+            }
+        }
+    }
+
+    private static String dumpVehiclePropValue(VehiclePropValue value) {
+        final int MAX_BYTE_SIZE = 20;
+
+        StringBuilder sb = new StringBuilder()
+                .append("Property:0x").append(toHexString(value.prop))
+                .append(",timestamp:").append(value.timestamp)
+                .append(",zone:0x").append(toHexString(value.areaId))
+                .append(",floatValues: ").append(Arrays.toString(value.value.floatValues.toArray()))
+                .append(",int32Values: ").append(Arrays.toString(value.value.int32Values.toArray()))
+                .append(",int64Values: ")
+                .append(Arrays.toString(value.value.int64Values.toArray()));
+
+        if (value.value.bytes.size() > MAX_BYTE_SIZE) {
+            Object[] bytes = Arrays.copyOf(value.value.bytes.toArray(), MAX_BYTE_SIZE);
+            sb.append(",bytes: ").append(Arrays.toString(bytes));
+        } else {
+            sb.append(",bytes: ").append(Arrays.toString(value.value.bytes.toArray()));
+        }
+        sb.append(",string: ").append(value.value.stringValue);
+
+        return sb.toString();
+    }
+
+    private static VehiclePropValue createPropValue(int propId, int areaId) {
+        VehiclePropValue propValue = new VehiclePropValue();
+        propValue.prop = propId;
+        propValue.areaId = areaId;
+        return propValue;
+    }
 }
diff --git a/service/src/com/android/car/hal/VendorExtensionHalService.java b/service/src/com/android/car/hal/VendorExtensionHalService.java
index adcc754..0630bae 100644
--- a/service/src/com/android/car/hal/VendorExtensionHalService.java
+++ b/service/src/com/android/car/hal/VendorExtensionHalService.java
@@ -16,13 +16,13 @@
 
 package com.android.car.hal;
 
-import com.android.car.vehiclenetwork.VehiclePropValueUtil;
+import android.hardware.vehicle.V2_0.VehiclePropertyGroup;
 
 /**
  * Implementation of {@link HalServiceBase} that responsible for custom properties that were defined
  * by OEMs.
  */
-/*package*/ class VendorExtensionHalService extends PropertyHalServiceBase {
+public class VendorExtensionHalService extends PropertyHalServiceBase {
 
     private final static String TAG = VendorExtensionHalService.class.getSimpleName();
     private final static boolean DEBUG = false;
@@ -33,13 +33,15 @@
 
     @Override
     protected int managerToHalPropId(int managerPropId) {
-        return VehiclePropValueUtil.isCustomProperty(managerPropId)
-                ? managerPropId : NOT_SUPPORTED_PROPERTY;
+        return isVendorProperty(managerPropId) ? managerPropId : NOT_SUPPORTED_PROPERTY;
     }
 
     @Override
     protected int halToManagerPropId(int halPropId) {
-        return VehiclePropValueUtil.isCustomProperty(halPropId)
-                ? halPropId : NOT_SUPPORTED_PROPERTY;
+        return isVendorProperty(halPropId) ? halPropId : NOT_SUPPORTED_PROPERTY;
+    }
+
+    private static boolean isVendorProperty(int property) {
+        return (property & VehiclePropertyGroup.MASK) == VehiclePropertyGroup.VENDOR;
     }
 }
\ No newline at end of file
diff --git a/service/src/com/android/car/pm/CarPackageManagerService.java b/service/src/com/android/car/pm/CarPackageManagerService.java
index 9f73b61..8a3bd94 100644
--- a/service/src/com/android/car/pm/CarPackageManagerService.java
+++ b/service/src/com/android/car/pm/CarPackageManagerService.java
@@ -31,8 +31,8 @@
 import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.PackageManager.NameNotFoundException;
-import android.content.pm.ServiceInfo;
 import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
 import android.content.pm.Signature;
 import android.content.res.Resources;
 import android.os.Handler;
@@ -54,7 +54,6 @@
 import com.android.internal.annotations.GuardedBy;
 
 import java.io.PrintWriter;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
