Merge "Add LOG_TAGs to drm hal default modules"
diff --git a/audio/2.0/default/Stream.h b/audio/2.0/default/Stream.h
index 0bbd803..73afe05 100644
--- a/audio/2.0/default/Stream.h
+++ b/audio/2.0/default/Stream.h
@@ -127,6 +127,7 @@
                                              IStream::createMmapBuffer_cb _hidl_cb) {
     Result retval(Result::NOT_SUPPORTED);
     MmapBufferInfo info;
+    native_handle_t* hidlHandle = nullptr;
 
     if (mStream->create_mmap_buffer != NULL) {
         struct audio_mmap_buffer_info halInfo;
@@ -134,7 +135,7 @@
                 "create_mmap_buffer",
                 mStream->create_mmap_buffer(mStream, minSizeFrames, &halInfo));
         if (retval == Result::OK) {
-            native_handle_t* hidlHandle = native_handle_create(1, 0);
+            hidlHandle = native_handle_create(1, 0);
             hidlHandle->data[0] = halInfo.shared_memory_fd;
             info.sharedMemory = hidl_memory("audio_buffer", hidlHandle,
                                             frameSize *halInfo.buffer_size_frames);
@@ -143,6 +144,10 @@
         }
     }
     _hidl_cb(retval, info);
+    if (hidlHandle != nullptr) {
+        native_handle_close(hidlHandle);
+        native_handle_delete(hidlHandle);
+    }
     return Void();
 }
 
diff --git a/audio/2.0/default/StreamIn.cpp b/audio/2.0/default/StreamIn.cpp
index de7bf13..ad18986 100644
--- a/audio/2.0/default/StreamIn.cpp
+++ b/audio/2.0/default/StreamIn.cpp
@@ -275,7 +275,7 @@
     if (mDataMQ) {
         ALOGE("the client attempts to call prepareForReading twice");
         _hidl_cb(Result::INVALID_STATE,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<ReadStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
     std::unique_ptr<DataMQ> tempDataMQ(
@@ -285,7 +285,7 @@
         ALOGE_IF(!tempDataMQ->isValid(), "data MQ is invalid");
         ALOGE_IF(!tempStatusMQ->isValid(), "status MQ is invalid");
         _hidl_cb(Result::INVALID_ARGUMENTS,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<ReadStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
     // TODO: Remove event flag management once blocking MQ is implemented. b/33815422
@@ -293,7 +293,7 @@
     if (status != OK || !mEfGroup) {
         ALOGE("failed creating event flag for data MQ: %s", strerror(-status));
         _hidl_cb(Result::INVALID_ARGUMENTS,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<ReadStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
 
@@ -309,7 +309,7 @@
     if (status != OK) {
         ALOGW("failed to start reader thread: %s", strerror(-status));
         _hidl_cb(Result::INVALID_ARGUMENTS,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<ReadStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
 
diff --git a/audio/2.0/default/StreamOut.cpp b/audio/2.0/default/StreamOut.cpp
index ea6221e..1948b68 100644
--- a/audio/2.0/default/StreamOut.cpp
+++ b/audio/2.0/default/StreamOut.cpp
@@ -259,7 +259,7 @@
     if (mDataMQ) {
         ALOGE("the client attempts to call prepareForWriting twice");
         _hidl_cb(Result::INVALID_STATE,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<WriteStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
     std::unique_ptr<DataMQ> tempDataMQ(
@@ -269,7 +269,7 @@
         ALOGE_IF(!tempDataMQ->isValid(), "data MQ is invalid");
         ALOGE_IF(!tempStatusMQ->isValid(), "status MQ is invalid");
         _hidl_cb(Result::INVALID_ARGUMENTS,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<WriteStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
     // TODO: Remove event flag management once blocking MQ is implemented. b/33815422
@@ -277,7 +277,7 @@
     if (status != OK || !mEfGroup) {
         ALOGE("failed creating event flag for data MQ: %s", strerror(-status));
         _hidl_cb(Result::INVALID_ARGUMENTS,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<WriteStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
 
@@ -293,7 +293,7 @@
     if (status != OK) {
         ALOGW("failed to start writer thread: %s", strerror(-status));
         _hidl_cb(Result::INVALID_ARGUMENTS,
-                MQDescriptorSync<uint8_t>(), MQDescriptorSync<WriteStatus>());
+                DataMQ::Descriptor(), StatusMQ::Descriptor());
         return Void();
     }
 
diff --git a/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp b/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp
index eb28e46..516cd00 100644
--- a/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp
+++ b/biometrics/fingerprint/2.1/default/BiometricsFingerprint.cpp
@@ -25,6 +25,8 @@
 #include <hardware/fingerprint.h>
 #include "BiometricsFingerprint.h"
 
+#include <inttypes.h>
+
 namespace android {
 namespace hardware {
 namespace biometrics {
@@ -245,12 +247,12 @@
     if (auth_token != nullptr && auth_token_length > 0) {
         // TODO: cache service?
         sp<IServiceManager> sm = android::defaultServiceManager();
-        sp<IBinder> binder = sm->getService(String16("android.security.keystore"));
+        sp<::android::IBinder> binder = sm->getService(String16("android.security.keystore"));
         sp<IKeystoreService> service = interface_cast<IKeystoreService>(binder);
         if (service != nullptr) {
-            status_t ret = service->addAuthToken(auth_token, auth_token_length);
-            if (ret != ResponseCode::NO_ERROR) {
-                ALOGE("Falure sending auth token to KeyStore: %d", ret);
+            auto ret = service->addAuthToken(auth_token, auth_token_length);
+            if (!ret.isOk()) {
+                ALOGE("Failure sending auth token to KeyStore: %" PRId32, int32_t(ret));
             }
         } else {
             ALOGE("Unable to communicate with KeyStore");
diff --git a/bluetooth/1.0/vts/Android.mk b/bluetooth/1.0/vts/Android.mk
new file mode 100644
index 0000000..85e0c38
--- /dev/null
+++ b/bluetooth/1.0/vts/Android.mk
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(LOCAL_PATH)/functional/vts/testcases/hal/bluetooth/hidl/Android.mk
diff --git a/bluetooth/1.0/vts/BluetoothHci.vts b/bluetooth/1.0/vts/BluetoothHci.vts
new file mode 100644
index 0000000..1112371
--- /dev/null
+++ b/bluetooth/1.0/vts/BluetoothHci.vts
@@ -0,0 +1,61 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "IBluetoothHci"
+
+package: "android.hardware.bluetooth"
+
+import: "android.hardware.bluetooth@1.0::IBluetoothHciCallbacks"
+import: "android.hardware.bluetooth@1.0::types"
+
+interface: {
+    api: {
+        name: "initialize"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::bluetooth::V1_0::Status"
+        }
+        arg: {
+            type: TYPE_HIDL_INTERFACE
+            predefined_type: "IBluetoothHciCallbacks"
+            is_callback: false
+        }
+    }
+
+    api: {
+        name: "sendHciCommand"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "uint8_t"
+            }
+        }
+    }
+
+    api: {
+        name: "sendAclData"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "uint8_t"
+            }
+        }
+    }
+
+    api: {
+        name: "sendScoData"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "uint8_t"
+            }
+        }
+    }
+
+    api: {
+        name: "close"
+    }
+
+}
diff --git a/bluetooth/1.0/vts/BluetoothHciCallbacks.vts b/bluetooth/1.0/vts/BluetoothHciCallbacks.vts
new file mode 100644
index 0000000..f2df5b4
--- /dev/null
+++ b/bluetooth/1.0/vts/BluetoothHciCallbacks.vts
@@ -0,0 +1,43 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "IBluetoothHciCallbacks"
+
+package: "android.hardware.bluetooth"
+
+import: "android.hardware.bluetooth@1.0::types"
+
+interface: {
+    api: {
+        name: "hciEventReceived"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "uint8_t"
+            }
+        }
+    }
+
+    api: {
+        name: "aclDataReceived"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "uint8_t"
+            }
+        }
+    }
+
+    api: {
+        name: "scoDataReceived"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "uint8_t"
+            }
+        }
+    }
+
+}
diff --git a/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/Android.mk b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/Android.mk
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target/Android.mk b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target/Android.mk
new file mode 100644
index 0000000..98bb686
--- /dev/null
+++ b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target/Android.mk
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := HalBluetoothHidlTargetBasicTest
+VTS_CONFIG_SRC_DIR := testcases/hal/bluetooth/hidl/target
+include test/vts/tools/build/Android.host_config.mk
diff --git a/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target/AndroidTest.xml b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target/AndroidTest.xml
new file mode 100644
index 0000000..54fb89b
--- /dev/null
+++ b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target/AndroidTest.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<configuration description="Config for VTS Bluetooth HIDL HAL's basic target-side test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="HalBluetoothHidlTargetBasicTest" />
+        <option name="binary-test-sources" value="
+            _64bit::DATA/nativetest64/bluetooth_hidl_hal_test/bluetooth_hidl_hal_test,
+            "/>
+        <option name="binary-test-type" value="gtest" />
+        <option name="test-timeout" value="1m" />
+    </test>
+</configuration>
diff --git a/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target_profiling/Android.mk b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target_profiling/Android.mk
new file mode 100644
index 0000000..81a2db9
--- /dev/null
+++ b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target_profiling/Android.mk
@@ -0,0 +1,23 @@
+#
+## 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.
+# #
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := BluetoothHidlTargetProfilingTest
+VTS_CONFIG_SRC_DIR := testcases/hal/bluetooth/hidl/target_profiling
+include test/vts/tools/build/Android.host_config.mk
diff --git a/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target_profiling/AndroidTest.xml b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target_profiling/AndroidTest.xml
new file mode 100644
index 0000000..8052b3c
--- /dev/null
+++ b/bluetooth/1.0/vts/functional/vts/testcases/hal/bluetooth/hidl/target_profiling/AndroidTest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<configuration description="Config for VTS Bluetooth HIDL HAL's target-side profiling test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="BluetoothHidlTargetProfilingTest" />
+        <option name="binary-test-sources" value="
+            _64bit::DATA/nativetest64/bluetooth_hidl_hal_test/bluetooth_hidl_hal_test,
+            "/>
+        <option name="binary-test-type" value="gtest" />
+        <option name="test-timeout" value="1m" />
+    <option name="enable-profiling" value="true" />
+    </test>
+</configuration>
diff --git a/bluetooth/1.0/vts/types.vts b/bluetooth/1.0/vts/types.vts
new file mode 100644
index 0000000..59eb3d4
--- /dev/null
+++ b/bluetooth/1.0/vts/types.vts
@@ -0,0 +1,32 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "types"
+
+package: "android.hardware.bluetooth"
+
+
+attribute: {
+    name: "::android::hardware::bluetooth::V1_0::Status"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "int32_t"
+
+        enumerator: "SUCCESS"
+        scalar_value: {
+            int32_t: 0
+        }
+        enumerator: "TRANSPORT_ERROR"
+        scalar_value: {
+            int32_t: 1
+        }
+        enumerator: "INITIALIZATION_ERROR"
+        scalar_value: {
+            int32_t: 2
+        }
+        enumerator: "UNKNOWN"
+        scalar_value: {
+            int32_t: 3
+        }
+    }
+}
+
diff --git a/boot/1.0/default/BootControl.cpp b/boot/1.0/default/BootControl.cpp
index 828da16..9a90076 100644
--- a/boot/1.0/default/BootControl.cpp
+++ b/boot/1.0/default/BootControl.cpp
@@ -93,14 +93,14 @@
 }
 
 
-IBootControl* HIDL_FETCH_IBootControl(const char* hal) {
+IBootControl* HIDL_FETCH_IBootControl(const char* /* hal */) {
     int ret = 0;
     boot_control_module_t* module = NULL;
     hw_module_t **hwm = reinterpret_cast<hw_module_t**>(&module);
-    ret = hw_get_module(hal, const_cast<const hw_module_t**>(hwm));
+    ret = hw_get_module(BOOT_CONTROL_HARDWARE_MODULE_ID, const_cast<const hw_module_t**>(hwm));
     if (ret)
     {
-        ALOGE("hw_get_module %s failed: %d", hal, ret);
+        ALOGE("hw_get_module %s failed: %d", BOOT_CONTROL_HARDWARE_MODULE_ID, ret);
         return nullptr;
     }
     module->init(module);
diff --git a/boot/1.0/default/service.cpp b/boot/1.0/default/service.cpp
index 0dc56bf..f3996ef 100644
--- a/boot/1.0/default/service.cpp
+++ b/boot/1.0/default/service.cpp
@@ -22,5 +22,5 @@
 using android::hardware::defaultPassthroughServiceImplementation;
 
 int main (int /* argc */, char * /* argv */ []) {
-    return defaultPassthroughServiceImplementation<IBootControl>("bootctrl");
+    return defaultPassthroughServiceImplementation<IBootControl>();
 }
diff --git a/boot/1.0/vts/functional/boot_hidl_hal_test.cpp b/boot/1.0/vts/functional/boot_hidl_hal_test.cpp
index 3413a93..36142df 100644
--- a/boot/1.0/vts/functional/boot_hidl_hal_test.cpp
+++ b/boot/1.0/vts/functional/boot_hidl_hal_test.cpp
@@ -35,7 +35,7 @@
 class BootHidlTest : public ::testing::Test {
  public:
   virtual void SetUp() override {
-    boot = IBootControl::getService("bootctrl");
+    boot = IBootControl::getService();
     ASSERT_NE(boot, nullptr);
   }
 
diff --git a/camera/device/3.2/default/Android.bp b/camera/device/3.2/default/Android.bp
index 9820220..40d4253 100644
--- a/camera/device/3.2/default/Android.bp
+++ b/camera/device/3.2/default/Android.bp
@@ -20,3 +20,27 @@
     ],
     export_include_dirs: ["."]
 }
+
+cc_library_shared {
+    name: "android.hardware.camera.device@3.2-impl-binderized",
+    srcs: ["CameraDevice.cpp",
+           "CameraDeviceSession.cpp",
+           "convert.cpp"],
+    cppflags: ["-DBINDERIZED"],
+    shared_libs: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "libcutils",
+        "android.hardware.camera.device@3.2",
+        "android.hardware.camera.provider@2.4",
+        "liblog",
+        "libhardware",
+        "libcamera_metadata"
+    ],
+    static_libs: [
+        "android.hardware.camera.common@1.0-helper"
+    ],
+    export_include_dirs: ["."]
+}
diff --git a/camera/provider/2.4/default/Android.bp b/camera/provider/2.4/default/Android.bp
index f28c9cd..ee40ce5 100644
--- a/camera/provider/2.4/default/Android.bp
+++ b/camera/provider/2.4/default/Android.bp
@@ -21,3 +21,29 @@
         "android.hardware.camera.common@1.0-helper"
     ]
 }
+
+cc_binary {
+    name: "android.hardware.camera.provider@2.4-service",
+    relative_install_path: "hw",
+    srcs: ["service.cpp", "CameraProvider.cpp"],
+    compile_multilib: "32",
+    init_rc: ["android.hardware.camera.provider@2.4-service.rc"],
+    shared_libs: [
+        "libhidlbase",
+        "libhidltransport",
+        "liblog",
+        "libhwbinder",
+        "libutils",
+        "libhardware",
+        "android.hardware.camera.device@1.0",
+        "android.hardware.camera.device@3.2",
+        "android.hardware.camera.provider@2.4",
+        "android.hardware.camera.common@1.0",
+        "libcutils",
+        "android.hardware.camera.device@3.2-impl-binderized",
+        "libcamera_metadata"
+    ],
+    static_libs: [
+        "android.hardware.camera.common@1.0-helper"
+    ]
+}
diff --git a/camera/provider/2.4/default/CameraProvider.cpp b/camera/provider/2.4/default/CameraProvider.cpp
index 9617d8d..1a34aa6 100644
--- a/camera/provider/2.4/default/CameraProvider.cpp
+++ b/camera/provider/2.4/default/CameraProvider.cpp
@@ -17,8 +17,6 @@
 #define LOG_TAG "CamProvider@2.4-impl"
 #include <android/log.h>
 
-#include <regex>
-
 #include "CameraProvider.h"
 #include "CameraDevice.h"
 #include <string.h>
diff --git a/camera/provider/2.4/default/CameraProvider.h b/camera/provider/2.4/default/CameraProvider.h
index 8497ff3..2a43e2f 100644
--- a/camera/provider/2.4/default/CameraProvider.h
+++ b/camera/provider/2.4/default/CameraProvider.h
@@ -17,6 +17,7 @@
 #ifndef ANDROID_HARDWARE_CAMERA_PROVIDER_V2_4_CAMERAPROVIDER_H
 #define ANDROID_HARDWARE_CAMERA_PROVIDER_V2_4_CAMERAPROVIDER_H
 
+#include <regex>
 #include "hardware/camera_common.h"
 #include "utils/Mutex.h"
 #include "utils/SortedVector.h"
diff --git a/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc b/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc
new file mode 100644
index 0000000..31f0810
--- /dev/null
+++ b/camera/provider/2.4/default/android.hardware.camera.provider@2.4-service.rc
@@ -0,0 +1,6 @@
+service camera-provider-2-4 /system/bin/hw/android.hardware.camera.provider@2.4-service
+    class hal
+    user cameraserver
+    group audio camera input drmrpc
+    ioprio rt 4
+    writepid /dev/cpuset/camera-daemon/tasks /dev/stune/top-app/tasks
\ No newline at end of file
diff --git a/camera/provider/2.4/default/service.cpp b/camera/provider/2.4/default/service.cpp
new file mode 100644
index 0000000..2723dee
--- /dev/null
+++ b/camera/provider/2.4/default/service.cpp
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "android.hardware.camera.provider@2.4-service"
+
+#include <android/hardware/camera/provider/2.4/ICameraProvider.h>
+#include <CameraProvider.h>
+
+#include <hidl/HidlTransportSupport.h>
+#include <utils/StrongPointer.h>
+
+using android::hardware::configureRpcThreadpool;
+using android::hardware::joinRpcThreadpool;
+using android::sp;
+using android::hardware::camera::provider::V2_4::ICameraProvider;
+using android::hardware::camera::provider::V2_4::implementation::HIDL_FETCH_ICameraProvider;
+
+int main()
+{
+    const char instance[] = "legacy/0";
+
+    ALOGI("Camera provider Service is starting.");
+
+    configureRpcThreadpool(1, true /* callerWillJoin */);
+    // TODO (b/34510650): check the passthrough/binderized dev key
+    sp<ICameraProvider> service = HIDL_FETCH_ICameraProvider(instance);
+    if (service == nullptr) {
+        ALOGI("Camera provider getService returned NULL");
+        return -1;
+    }
+
+    LOG_FATAL_IF(service->isRemote(), "Camera provider service is REMOTE!");
+
+    service->registerAsService(instance);
+    joinRpcThreadpool();
+
+    return 0;
+}
\ No newline at end of file
diff --git a/contexthub/1.0/vts/Android.mk b/contexthub/1.0/vts/Android.mk
new file mode 100644
index 0000000..266884b
--- /dev/null
+++ b/contexthub/1.0/vts/Android.mk
@@ -0,0 +1,21 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+contexthub-vts-path := $(LOCAL_PATH)
+
+include $(contexthub-vts-path)/functional/vts/testcases/hal/contexthub/hidl/target/Android.mk
diff --git a/contexthub/1.0/vts/Contexthub.vts b/contexthub/1.0/vts/Contexthub.vts
new file mode 100644
index 0000000..b4e42f5
--- /dev/null
+++ b/contexthub/1.0/vts/Contexthub.vts
@@ -0,0 +1,147 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "IContexthub"
+
+package: "android.hardware.contexthub"
+
+import: "android.hardware.contexthub@1.0::IContexthubCallback"
+import: "android.hardware.contexthub@1.0::types"
+
+interface: {
+    api: {
+        name: "getHubs"
+        return_type_hidl: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_STRUCT
+                predefined_type: "::android::hardware::contexthub::V1_0::ContextHub"
+            }
+        }
+    }
+
+    api: {
+        name: "registerCallback"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_HIDL_CALLBACK
+            predefined_type: "IContexthubCallback"
+            is_callback: true
+        }
+    }
+
+    api: {
+        name: "sendMessageToHub"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_STRUCT
+            predefined_type: "::android::hardware::contexthub::V1_0::ContextHubMsg"
+        }
+    }
+
+    api: {
+        name: "loadNanoApp"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_STRUCT
+            predefined_type: "::android::hardware::contexthub::V1_0::NanoAppBinary"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+    }
+
+    api: {
+        name: "unloadNanoApp"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint64_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+    }
+
+    api: {
+        name: "enableNanoApp"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint64_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+    }
+
+    api: {
+        name: "disableNanoApp"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint64_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+    }
+
+    api: {
+        name: "queryApps"
+        return_type_hidl: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::Result"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+    }
+
+}
diff --git a/contexthub/1.0/vts/ContexthubCallback.vts b/contexthub/1.0/vts/ContexthubCallback.vts
new file mode 100644
index 0000000..c3784e8
--- /dev/null
+++ b/contexthub/1.0/vts/ContexthubCallback.vts
@@ -0,0 +1,61 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "IContexthubCallback"
+
+package: "android.hardware.contexthub"
+
+import: "android.hardware.contexthub@1.0::types"
+
+interface: {
+    api: {
+        name: "handleClientMsg"
+        arg: {
+            type: TYPE_STRUCT
+            predefined_type: "::android::hardware::contexthub::V1_0::ContextHubMsg"
+        }
+    }
+
+    api: {
+        name: "handleTxnResult"
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+        arg: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::TransactionResult"
+        }
+    }
+
+    api: {
+        name: "handleHubEvent"
+        arg: {
+            type: TYPE_ENUM
+            predefined_type: "::android::hardware::contexthub::V1_0::AsyncEventType"
+        }
+    }
+
+    api: {
+        name: "handleAppAbort"
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint64_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "uint32_t"
+        }
+    }
+
+    api: {
+        name: "handleAppsInfo"
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_STRUCT
+                predefined_type: "::android::hardware::contexthub::V1_0::HubAppInfo"
+            }
+        }
+    }
+
+}
diff --git a/contexthub/1.0/vts/functional/Android.bp b/contexthub/1.0/vts/functional/Android.bp
new file mode 100644
index 0000000..e78898e
--- /dev/null
+++ b/contexthub/1.0/vts/functional/Android.bp
@@ -0,0 +1,38 @@
+//
+// Copyright (C) 2017 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.
+//
+
+cc_test {
+    name: "contexthub_hidl_hal_test",
+    gtest: true,
+    srcs: ["contexthub_hidl_hal_test.cpp"],
+    shared_libs: [
+        "liblog",
+        "libhidlbase",
+        "libhidltransport",
+        "libutils",
+        "android.hardware.contexthub@1.0",
+    ],
+    static_libs: ["libgtest"],
+    cflags: [
+        "--coverage",
+        "-O0",
+        "-g",
+    ],
+    ldflags: [
+        "--coverage",
+    ],
+}
+
diff --git a/contexthub/1.0/vts/functional/contexthub_hidl_hal_test.cpp b/contexthub/1.0/vts/functional/contexthub_hidl_hal_test.cpp
new file mode 100644
index 0000000..e4dea4f
--- /dev/null
+++ b/contexthub/1.0/vts/functional/contexthub_hidl_hal_test.cpp
@@ -0,0 +1,388 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "contexthub_hidl_hal_test"
+
+#include <android-base/logging.h>
+#include <android/hardware/contexthub/1.0/IContexthub.h>
+#include <android/hardware/contexthub/1.0/IContexthubCallback.h>
+#include <android/hardware/contexthub/1.0/types.h>
+#include <android/log.h>
+#include <gtest/gtest.h>
+
+#include <cinttypes>
+#include <future>
+#include <utility>
+
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::contexthub::V1_0::AsyncEventType;
+using ::android::hardware::contexthub::V1_0::ContextHub;
+using ::android::hardware::contexthub::V1_0::ContextHubMsg;
+using ::android::hardware::contexthub::V1_0::HubAppInfo;
+using ::android::hardware::contexthub::V1_0::IContexthub;
+using ::android::hardware::contexthub::V1_0::IContexthubCallback;
+using ::android::hardware::contexthub::V1_0::NanoAppBinary;
+using ::android::hardware::contexthub::V1_0::Result;
+using ::android::hardware::contexthub::V1_0::TransactionResult;
+using ::android::sp;
+
+#define CONTEXTHUB_SERVICE_NAME "contexthub"
+
+#define ASSERT_OK(result) ASSERT_EQ(result, Result::OK)
+#define EXPECT_OK(result) EXPECT_EQ(result, Result::OK)
+
+namespace {
+
+// App ID with vendor "GoogT" (Google Testing), app identifier 0x555555. This
+// app ID is reserved and must never appear in the list of loaded apps.
+constexpr uint64_t kNonExistentAppId = 0x476f6f6754555555;
+
+// Helper that does explicit conversion of an enum class to its underlying/base
+// type. Useful for stream output of enum values.
+template<typename EnumType>
+constexpr typename std::underlying_type<EnumType>::type asBaseType(
+    EnumType value) {
+  return static_cast<typename std::underlying_type<EnumType>::type>(value);
+}
+
+// Synchronously queries IContexthub::getHubs() and returns the result
+hidl_vec<ContextHub> getHubsSync(sp<IContexthub> hubApi) {
+  hidl_vec<ContextHub> hubList;
+  std::promise<void> barrier;
+
+  hubApi->getHubs([&hubList, &barrier](const hidl_vec<ContextHub>& hubs) {
+    hubList = hubs;
+    barrier.set_value();
+  });
+  barrier.get_future().wait_for(std::chrono::seconds(1));
+
+  return hubList;
+}
+
+// Gets a list of valid hub IDs in the system
+std::vector<uint32_t> getHubIds() {
+  static std::vector<uint32_t> hubIds;
+
+  if (hubIds.size() == 0) {
+    sp<IContexthub> hubApi = IContexthub::getService(CONTEXTHUB_SERVICE_NAME);
+
+    if (hubApi != nullptr) {
+      for (ContextHub hub : getHubsSync(hubApi)) {
+        hubIds.push_back(hub.hubId);
+      }
+    }
+  }
+
+  ALOGD("Running tests against all %zu reported hubs", hubIds.size());
+  return hubIds;
+}
+
+// Base test fixture that initializes the HAL and makes the context hub API
+// handle available
+class ContexthubHidlTestBase : public ::testing::Test {
+ public:
+  virtual void SetUp() override {
+    hubApi = IContexthub::getService(CONTEXTHUB_SERVICE_NAME);
+    ASSERT_NE(hubApi, nullptr);
+
+    // getHubs() must be called at least once for proper initialization of the
+    // HAL implementation
+    getHubsSync(hubApi);
+  }
+
+  virtual void TearDown() override {}
+
+  sp<IContexthub> hubApi;
+};
+
+// Test fixture parameterized by hub ID
+class ContexthubHidlTest : public ContexthubHidlTestBase,
+                           public ::testing::WithParamInterface<uint32_t> {
+ public:
+  uint32_t getHubId() {
+    return GetParam();
+  }
+
+  Result registerCallback(sp<IContexthubCallback> cb) {
+    Result result = hubApi->registerCallback(getHubId(), cb);
+    ALOGD("Registered callback, result %" PRIu32, result);
+    return result;
+  }
+};
+
+// Base callback implementation that just logs all callbacks by default
+class ContexthubCallbackBase : public IContexthubCallback {
+ public:
+  virtual Return<void> handleClientMsg(const ContextHubMsg& /*msg*/) override {
+    ALOGD("Got client message callback");
+    return Void();
+  }
+
+  virtual Return<void> handleTxnResult(
+      uint32_t txnId, TransactionResult result) override {
+    ALOGD("Got transaction result callback for txnId %" PRIu32 " with result %"
+          PRId32, txnId, result);
+    return Void();
+  }
+
+  virtual Return<void> handleHubEvent(AsyncEventType evt) override {
+    ALOGD("Got hub event callback for event type %" PRIu32, evt);
+    return Void();
+  }
+
+  virtual Return<void> handleAppAbort(uint64_t appId, uint32_t abortCode)
+      override {
+    ALOGD("Got app abort notification for appId 0x%" PRIx64 " with abort code "
+          "0x%" PRIx32, appId, abortCode);
+    return Void();
+  }
+
+  virtual Return<void> handleAppsInfo(const hidl_vec<HubAppInfo>& /*appInfo*/)
+      override {
+    ALOGD("Got app info callback");
+    return Void();
+  }
+};
+
+// Wait for a callback to occur (signaled by the given future) up to the
+// provided timeout. If the future is invalid or the callback does not come
+// within the given time, returns false.
+template<class ReturnType>
+bool waitForCallback(
+    std::future<ReturnType> future,
+    ReturnType *result,
+    std::chrono::milliseconds timeout = std::chrono::seconds(5)) {
+  auto expiration = std::chrono::system_clock::now() + timeout;
+
+  EXPECT_NE(result, nullptr);
+  EXPECT_TRUE(future.valid());
+  if (result != nullptr && future.valid()) {
+    std::future_status status = future.wait_until(expiration);
+    EXPECT_NE(status, std::future_status::timeout)
+        << "Timed out waiting for callback";
+
+    if (status == std::future_status::ready) {
+      *result = future.get();
+      return true;
+    }
+  }
+
+  return false;
+}
+
+// Ensures that the metadata reported in getHubs() is sane
+TEST_F(ContexthubHidlTestBase, TestGetHubs) {
+  hidl_vec<ContextHub> hubs = getHubsSync(hubApi);
+  ALOGD("System reports %zu hubs", hubs.size());
+
+  for (ContextHub hub : hubs) {
+    ALOGD("Checking hub ID %" PRIu32, hub.hubId);
+
+    EXPECT_FALSE(hub.name.empty());
+    EXPECT_FALSE(hub.vendor.empty());
+    EXPECT_FALSE(hub.toolchain.empty());
+    EXPECT_GT(hub.peakMips, 0);
+    EXPECT_GE(hub.stoppedPowerDrawMw, 0);
+    EXPECT_GE(hub.sleepPowerDrawMw, 0);
+    EXPECT_GT(hub.peakPowerDrawMw, 0);
+
+    // Minimum 128 byte MTU as required by CHRE API v1.0
+    EXPECT_GE(hub.maxSupportedMsgLen, UINT32_C(128));
+  }
+}
+
+TEST_P(ContexthubHidlTest, TestRegisterCallback) {
+  ALOGD("TestRegisterCallback called, hubId %" PRIu32, getHubId());
+  ASSERT_OK(registerCallback(new ContexthubCallbackBase()));
+}
+
+TEST_P(ContexthubHidlTest, TestRegisterNullCallback) {
+  ALOGD("TestRegisterNullCallback called, hubId %" PRIu32, getHubId());
+  ASSERT_OK(registerCallback(nullptr));
+}
+
+// Helper callback that puts the async appInfo callback data into a promise
+class QueryAppsCallback : public ContexthubCallbackBase {
+ public:
+  virtual Return<void> handleAppsInfo(const hidl_vec<HubAppInfo>& appInfo)
+      override {
+    ALOGD("Got app info callback with %zu apps", appInfo.size());
+    promise.set_value(appInfo);
+    return Void();
+  }
+
+  std::promise<hidl_vec<HubAppInfo>> promise;
+};
+
+// Calls queryApps() and checks the returned metadata
+TEST_P(ContexthubHidlTest, TestQueryApps) {
+  ALOGD("TestQueryApps called, hubId %u", getHubId());
+  sp<QueryAppsCallback> cb = new QueryAppsCallback();
+  ASSERT_OK(registerCallback(cb));
+
+  Result result = hubApi->queryApps(getHubId());
+  ASSERT_OK(result);
+
+  ALOGD("Waiting for app info callback");
+  hidl_vec<HubAppInfo> appList;
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future(), &appList));
+  for (const HubAppInfo &appInfo : appList) {
+    EXPECT_NE(appInfo.appId, UINT64_C(0));
+    EXPECT_NE(appInfo.appId, kNonExistentAppId);
+  }
+}
+
+// Helper callback that puts the TransactionResult for the expectedTxnId into a
+// promise
+class TxnResultCallback : public ContexthubCallbackBase {
+ public:
+  virtual Return<void> handleTxnResult(
+      uint32_t txnId, TransactionResult result) override {
+    ALOGD("Got transaction result callback for txnId %" PRIu32 " (expecting %"
+          PRIu32 ") with result %" PRId32, txnId, expectedTxnId, result);
+    if (txnId == expectedTxnId) {
+      promise.set_value(result);
+    }
+    return Void();
+  }
+
+  uint32_t expectedTxnId = 0;
+  std::promise<TransactionResult> promise;
+};
+
+// Parameterized fixture that sets the callback to TxnResultCallback
+class ContexthubTxnTest : public ContexthubHidlTest {
+ public:
+  virtual void SetUp() override {
+    ContexthubHidlTest::SetUp();
+    ASSERT_OK(registerCallback(cb));
+  }
+
+  sp<TxnResultCallback> cb = new TxnResultCallback();
+};
+
+
+// Checks cases where the hub implementation is expected to return an error, but
+// that error can be returned either synchronously or in the asynchronous
+// transaction callback. Returns an AssertionResult that can be used in
+// ASSERT/EXPECT_TRUE. Allows checking the sync result against 1 additional
+// allowed error code apart from OK and TRANSACTION_FAILED, which are always
+// allowed.
+::testing::AssertionResult checkFailureSyncOrAsync(
+    Result result, Result allowedSyncResult,
+    std::future<TransactionResult>&& future) {
+  if (result == Result::OK) {
+    // No error reported synchronously - this is OK, but then we should get an
+    // async callback with a failure status
+    TransactionResult asyncResult;
+    if (!waitForCallback(std::forward<std::future<TransactionResult>>(future),
+                         &asyncResult)) {
+      return ::testing::AssertionFailure()
+          << "Got successful sync result, then failed to receive async cb";
+    } else if (asyncResult == TransactionResult::SUCCESS) {
+      return ::testing::AssertionFailure()
+          << "Got successful sync result, then unexpected successful async "
+             "result";
+    }
+  } else if (result != allowedSyncResult &&
+             result != Result::TRANSACTION_FAILED) {
+    return ::testing::AssertionFailure() << "Got sync result "
+        << asBaseType(result) << ", expected TRANSACTION_FAILED or "
+        << asBaseType(allowedSyncResult);
+  }
+
+  return ::testing::AssertionSuccess();
+}
+
+TEST_P(ContexthubTxnTest, TestSendMessageToNonExistentNanoApp) {
+  ContextHubMsg msg;
+  msg.appName = kNonExistentAppId;
+  msg.msgType = 1;
+  msg.msg.resize(4);
+  std::fill(msg.msg.begin(), msg.msg.end(), 0);
+
+  ALOGD("Sending message to non-existent nanoapp");
+  Result result = hubApi->sendMessageToHub(getHubId(), msg);
+  if (result != Result::OK &&
+      result != Result::BAD_PARAMS &&
+      result != Result::TRANSACTION_FAILED) {
+    FAIL() << "Got result " << asBaseType(result) << ", expected OK, BAD_PARAMS"
+        << ", or TRANSACTION_FAILED";
+  }
+}
+
+TEST_P(ContexthubTxnTest, TestLoadEmptyNanoApp) {
+  cb->expectedTxnId = 0123;
+  NanoAppBinary emptyApp;
+
+  emptyApp.appId = kNonExistentAppId;
+  emptyApp.appVersion = 1;
+  emptyApp.flags = 0;
+  emptyApp.targetChreApiMajorVersion = 1;
+  emptyApp.targetChreApiMinorVersion = 0;
+
+  ALOGD("Loading empty nanoapp");
+  Result result = hubApi->loadNanoApp(getHubId(), emptyApp, cb->expectedTxnId);
+  EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS,
+                                      cb->promise.get_future()));
+}
+
+TEST_P(ContexthubTxnTest, TestUnloadNonexistentNanoApp) {
+  cb->expectedTxnId = 1234;
+
+  ALOGD("Unloading nonexistent nanoapp");
+  Result result = hubApi->unloadNanoApp(getHubId(), kNonExistentAppId,
+                                        cb->expectedTxnId);
+  EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS,
+                                      cb->promise.get_future()));
+}
+
+TEST_P(ContexthubTxnTest, TestEnableNonexistentNanoApp) {
+  cb->expectedTxnId = 2345;
+
+  ALOGD("Enabling nonexistent nanoapp");
+  Result result = hubApi->enableNanoApp(getHubId(), kNonExistentAppId,
+                                        cb->expectedTxnId);
+  EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS,
+                                      cb->promise.get_future()));
+}
+
+TEST_P(ContexthubTxnTest, TestDisableNonexistentNanoApp) {
+  cb->expectedTxnId = 3456;
+
+  ALOGD("Disabling nonexistent nanoapp");
+  Result result = hubApi->disableNanoApp(getHubId(), kNonExistentAppId,
+                                         cb->expectedTxnId);
+  EXPECT_TRUE(checkFailureSyncOrAsync(result, Result::BAD_PARAMS,
+                                      cb->promise.get_future()));
+}
+
+// Parameterize all SingleContexthubTest tests against each valid hub ID
+INSTANTIATE_TEST_CASE_P(HubIdSpecificTests, ContexthubHidlTest,
+                        ::testing::ValuesIn(getHubIds()));
+INSTANTIATE_TEST_CASE_P(HubIdSpecificTests, ContexthubTxnTest,
+                        ::testing::ValuesIn(getHubIds()));
+
+} // anonymous namespace
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+
diff --git a/contexthub/1.0/vts/functional/vts/testcases/hal/contexthub/hidl/target/Android.mk b/contexthub/1.0/vts/functional/vts/testcases/hal/contexthub/hidl/target/Android.mk
new file mode 100644
index 0000000..a46a0e6
--- /dev/null
+++ b/contexthub/1.0/vts/functional/vts/testcases/hal/contexthub/hidl/target/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := ContexthubHidlTargetTest
+VTS_CONFIG_SRC_DIR := testcases/hal/contexthub/hidl/target
+include test/vts/tools/build/Android.host_config.mk
diff --git a/contexthub/1.0/vts/functional/vts/testcases/hal/contexthub/hidl/target/AndroidTest.xml b/contexthub/1.0/vts/functional/vts/testcases/hal/contexthub/hidl/target/AndroidTest.xml
new file mode 100644
index 0000000..a314d1b
--- /dev/null
+++ b/contexthub/1.0/vts/functional/vts/testcases/hal/contexthub/hidl/target/AndroidTest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Config for VTS Context Hub HIDL HAL's target-side test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="ContexthubHidlTargetTest" />
+        <option name="binary-test-sources" value="
+            _32bit::DATA/nativetest/contexthub_hidl_hal_test/contexthub_hidl_hal_test,
+            _64bit::DATA/nativetest64/contexthub_hidl_hal_test/contexthub_hidl_hal_test,
+            "/>
+        <option name="binary-test-type" value="gtest" />
+        <option name="binary-test-disable-framework" value="true" />
+        <option name="test-timeout" value="10m" />
+    </test>
+</configuration>
+
diff --git a/contexthub/1.0/vts/types.vts b/contexthub/1.0/vts/types.vts
new file mode 100644
index 0000000..12576b1
--- /dev/null
+++ b/contexthub/1.0/vts/types.vts
@@ -0,0 +1,475 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "types"
+
+package: "android.hardware.contexthub"
+
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::Result"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint32_t"
+
+        enumerator: "OK"
+        scalar_value: {
+            uint32_t: 0
+        }
+        enumerator: "UNKNOWN_FAILURE"
+        scalar_value: {
+            uint32_t: 1
+        }
+        enumerator: "BAD_PARAMS"
+        scalar_value: {
+            uint32_t: 2
+        }
+        enumerator: "NOT_INIT"
+        scalar_value: {
+            uint32_t: 3
+        }
+        enumerator: "TRANSACTION_FAILED"
+        scalar_value: {
+            uint32_t: 4
+        }
+        enumerator: "TRANSACTION_PENDING"
+        scalar_value: {
+            uint32_t: 5
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::NanoAppFlags"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint32_t"
+
+        enumerator: "SIGNED"
+        scalar_value: {
+            uint32_t: 1
+        }
+        enumerator: "ENCRYPTED"
+        scalar_value: {
+            uint32_t: 2
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::NanoAppBinary"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "appId"
+        type: TYPE_SCALAR
+        scalar_type: "uint64_t"
+    }
+    struct_value: {
+        name: "appVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "flags"
+        type: TYPE_MASK
+        predefined_type: "::android::hardware::contexthub::V1_0::NanoAppFlags"
+    }
+    struct_value: {
+        name: "targetChreApiMajorVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint8_t"
+    }
+    struct_value: {
+        name: "targetChreApiMinorVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint8_t"
+    }
+    struct_value: {
+        name: "customBinary"
+        type: TYPE_VECTOR
+        vector_value: {
+            type: TYPE_SCALAR
+            scalar_type: "uint8_t"
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::SensorType"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint32_t"
+
+        enumerator: "RESERVED"
+        scalar_value: {
+            uint32_t: 0
+        }
+        enumerator: "ACCELEROMETER"
+        scalar_value: {
+            uint32_t: 1
+        }
+        enumerator: "GYROSCOPE"
+        scalar_value: {
+            uint32_t: 2
+        }
+        enumerator: "MAGNETOMETER"
+        scalar_value: {
+            uint32_t: 3
+        }
+        enumerator: "BAROMETER"
+        scalar_value: {
+            uint32_t: 4
+        }
+        enumerator: "PROXIMITY_SENSOR"
+        scalar_value: {
+            uint32_t: 5
+        }
+        enumerator: "AMBIENT_LIGHT_SENSOR"
+        scalar_value: {
+            uint32_t: 6
+        }
+        enumerator: "STATIONARY_DETECT"
+        scalar_value: {
+            uint32_t: 7
+        }
+        enumerator: "INSTANT_MOTION_DETECT"
+        scalar_value: {
+            uint32_t: 8
+        }
+        enumerator: "GPS"
+        scalar_value: {
+            uint32_t: 256
+        }
+        enumerator: "WIFI"
+        scalar_value: {
+            uint32_t: 512
+        }
+        enumerator: "AUDIO"
+        scalar_value: {
+            uint32_t: 768
+        }
+        enumerator: "CAMERA"
+        scalar_value: {
+            uint32_t: 1024
+        }
+        enumerator: "BLE"
+        scalar_value: {
+            uint32_t: 1280
+        }
+        enumerator: "WWAN"
+        scalar_value: {
+            uint32_t: 1536
+        }
+        enumerator: "PRIVATE_SENSOR_BASE"
+        scalar_value: {
+            uint32_t: 65536
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::PhysicalSensor"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "sensorType"
+        type: TYPE_ENUM
+        predefined_type: "::android::hardware::contexthub::V1_0::SensorType"
+    }
+    struct_value: {
+        name: "type"
+        type: TYPE_STRING
+    }
+    struct_value: {
+        name: "name"
+        type: TYPE_STRING
+    }
+    struct_value: {
+        name: "vendor"
+        type: TYPE_STRING
+    }
+    struct_value: {
+        name: "version"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "fifoReservedCount"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "fifoMaxCount"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "minDelayMs"
+        type: TYPE_SCALAR
+        scalar_type: "uint64_t"
+    }
+    struct_value: {
+        name: "maxDelayMs"
+        type: TYPE_SCALAR
+        scalar_type: "uint64_t"
+    }
+    struct_value: {
+        name: "peakPowerMw"
+        type: TYPE_SCALAR
+        scalar_type: "float_t"
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::ContextHub"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "name"
+        type: TYPE_STRING
+    }
+    struct_value: {
+        name: "vendor"
+        type: TYPE_STRING
+    }
+    struct_value: {
+        name: "toolchain"
+        type: TYPE_STRING
+    }
+    struct_value: {
+        name: "platformVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "toolchainVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "hubId"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "peakMips"
+        type: TYPE_SCALAR
+        scalar_type: "float_t"
+    }
+    struct_value: {
+        name: "stoppedPowerDrawMw"
+        type: TYPE_SCALAR
+        scalar_type: "float_t"
+    }
+    struct_value: {
+        name: "sleepPowerDrawMw"
+        type: TYPE_SCALAR
+        scalar_type: "float_t"
+    }
+    struct_value: {
+        name: "peakPowerDrawMw"
+        type: TYPE_SCALAR
+        scalar_type: "float_t"
+    }
+    struct_value: {
+        name: "connectedSensors"
+        type: TYPE_VECTOR
+        vector_value: {
+            type: TYPE_STRUCT
+            predefined_type: "::android::hardware::contexthub::V1_0::PhysicalSensor"
+        }
+    }
+    struct_value: {
+        name: "maxSupportedMsgLen"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "chrePlatformId"
+        type: TYPE_SCALAR
+        scalar_type: "uint64_t"
+    }
+    struct_value: {
+        name: "chreApiMajorVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint8_t"
+    }
+    struct_value: {
+        name: "chreApiMinorVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint8_t"
+    }
+    struct_value: {
+        name: "chrePatchVersion"
+        type: TYPE_SCALAR
+        scalar_type: "uint16_t"
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::HostEndPoint"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint16_t"
+
+        enumerator: "BROADCAST"
+        scalar_value: {
+            uint16_t: 65535
+        }
+        enumerator: "UNSPECIFIED"
+        scalar_value: {
+            uint16_t: 65534
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::ContextHubMsg"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "appName"
+        type: TYPE_SCALAR
+        scalar_type: "uint64_t"
+    }
+    struct_value: {
+        name: "hostEndPoint"
+        type: TYPE_SCALAR
+        scalar_type: "uint16_t"
+    }
+    struct_value: {
+        name: "msgType"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "msg"
+        type: TYPE_VECTOR
+        vector_value: {
+            type: TYPE_SCALAR
+            scalar_type: "uint8_t"
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::HubMemoryType"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint32_t"
+
+        enumerator: "MAIN"
+        scalar_value: {
+            uint32_t: 0
+        }
+        enumerator: "SECONDARY"
+        scalar_value: {
+            uint32_t: 1
+        }
+        enumerator: "TCM"
+        scalar_value: {
+            uint32_t: 2
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::HubMemoryFlag"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint32_t"
+
+        enumerator: "READ"
+        scalar_value: {
+            uint32_t: 1
+        }
+        enumerator: "WRITE"
+        scalar_value: {
+            uint32_t: 2
+        }
+        enumerator: "EXEC"
+        scalar_value: {
+            uint32_t: 4
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::MemRange"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "totalBytes"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "freeBytes"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "type"
+        type: TYPE_ENUM
+        predefined_type: "::android::hardware::contexthub::V1_0::HubMemoryType"
+    }
+    struct_value: {
+        name: "flags"
+        type: TYPE_MASK
+        predefined_type: "::android::hardware::contexthub::V1_0::HubMemoryFlag"
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::AsyncEventType"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "uint32_t"
+
+        enumerator: "RESTARTED"
+        scalar_value: {
+            uint32_t: 1
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::TransactionResult"
+    type: TYPE_ENUM
+    enum_value: {
+        scalar_type: "int32_t"
+
+        enumerator: "SUCCESS"
+        scalar_value: {
+            int32_t: 0
+        }
+        enumerator: "FAILURE"
+        scalar_value: {
+            int32_t: 1
+        }
+    }
+}
+
+attribute: {
+    name: "::android::hardware::contexthub::V1_0::HubAppInfo"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "appId"
+        type: TYPE_SCALAR
+        scalar_type: "uint64_t"
+    }
+    struct_value: {
+        name: "version"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "memUsage"
+        type: TYPE_VECTOR
+        vector_value: {
+            type: TYPE_STRUCT
+            predefined_type: "::android::hardware::contexthub::V1_0::MemRange"
+        }
+    }
+    struct_value: {
+        name: "enabled"
+        type: TYPE_SCALAR
+        scalar_type: "bool_t"
+    }
+}
+
diff --git a/contexthub/Android.bp b/contexthub/Android.bp
index ba90f2c..ed19a37 100644
--- a/contexthub/Android.bp
+++ b/contexthub/Android.bp
@@ -2,4 +2,5 @@
 subdirs = [
     "1.0",
     "1.0/default",
+    "1.0/vts/functional",
 ]
diff --git a/gnss/1.0/IAGnss.hal b/gnss/1.0/IAGnss.hal
index 2cce519..b8f5746 100644
--- a/gnss/1.0/IAGnss.hal
+++ b/gnss/1.0/IAGnss.hal
@@ -22,6 +22,7 @@
  * Extended interface for AGNSS support.
  */
 interface IAGnss {
+    @export(name="", value_prefix="APN_IP_")
     enum ApnIpType : uint8_t {
         INVALID  = 0,
         IPV4     = 1,
diff --git a/gnss/1.0/IAGnssCallback.hal b/gnss/1.0/IAGnssCallback.hal
index 1984725..fe2e101 100644
--- a/gnss/1.0/IAGnssCallback.hal
+++ b/gnss/1.0/IAGnssCallback.hal
@@ -19,11 +19,13 @@
 /** Callback structure for the AGNSS interface. */
 interface IAGnssCallback {
     /** AGNSS type **/
+    @export(name="", value_prefix="AGPS_")
     enum AGnssType : uint8_t {
         TYPE_SUPL         = 1,
         TYPE_C2K          = 2
     };
 
+    @export(name="", value_prefix="GNSS_")
     enum AGnssStatusValue : uint8_t {
         /** GNSS requests data connection for AGNSS. */
         REQUEST_AGNSS_DATA_CONN  = 1,
@@ -40,6 +42,7 @@
     /*
      * Represents the status of AGNSS augmented to support IPv4.
      */
+    @export(name="", value_prefix="GPS_")
     struct AGnssStatusIpV4 {
         AGnssType type;
         AGnssStatusValue status;
diff --git a/gnss/1.0/IAGnssRil.hal b/gnss/1.0/IAGnssRil.hal
index 499b874..6292273 100644
--- a/gnss/1.0/IAGnssRil.hal
+++ b/gnss/1.0/IAGnssRil.hal
@@ -25,12 +25,14 @@
  * location, unique subscriber ID, phone number string and network availability changes.
  */
 interface IAGnssRil {
+    @export(name="", value_prefix="AGPS_SETID_TYPE_")
     enum SetIDType : uint8_t {
         NONE    = 0,
         IMSI    = 1,
         MSISDM  = 2
     };
 
+    @export(name="", value_prefix="AGPS_RIL_NETWORK_TYPE_")
     enum NetworkType : uint8_t {
         MOBILE  = 0,
         WIFI    = 1,
@@ -41,6 +43,7 @@
         WIMAX   = 6,
     };
 
+    @export(name="", value_prefix="AGPS_REF_LOCATION_TYPE_")
     enum AGnssRefLocationType : uint8_t {
         GSM_CELLID   = 1,
         UMTS_CELLID  = 2,
diff --git a/gnss/1.0/IAGnssRilCallback.hal b/gnss/1.0/IAGnssRilCallback.hal
index ba29bd0..2d64e54 100644
--- a/gnss/1.0/IAGnssRilCallback.hal
+++ b/gnss/1.0/IAGnssRilCallback.hal
@@ -22,6 +22,7 @@
  */
 interface IAGnssRilCallback {
     /* Kinds of SET ID that can be requested */
+    @export(name="", value_prefix="AGPS_RIL_REQUEST_SETID_")
     enum ID : uint32_t {
         IMSI    = 1 << 0L,
         MSISDN  = 1 << 1L,
diff --git a/gnss/1.0/IGnss.hal b/gnss/1.0/IGnss.hal
index 24a5371..5cde79e 100644
--- a/gnss/1.0/IGnss.hal
+++ b/gnss/1.0/IGnss.hal
@@ -28,9 +28,10 @@
 import IGnssNi;
 import IGnssXtra;
 
-/* Represents the standard GNSS interface. */
+/* Represents the standard GNSS (Global Navigation Satellite System) interface. */
 interface IGnss {
     /* Requested operational mode for GNSS operation. */
+    @export(name="", value_prefix="GPS_POSITION_MODE_")
     enum GnssPositionMode : uint8_t {
         /** Mode for running GNSS standalone (no assistance). */
         STANDALONE  = 0,
@@ -44,6 +45,7 @@
     };
 
     /* Requested recurrence mode for GNSS operation. */
+    @export(name="", value_prefix="GPS_POSITION_")
     enum GnssPositionRecurrence : uint32_t {
         /** Receive GNSS fixes on a recurring basis at a specified period. */
         RECURRENCE_PERIODIC  = 0,
@@ -55,6 +57,7 @@
      * Flags used to specify which aiding data to delete when calling
      * deleteAidingData().
      */
+    @export(name="", value_prefix="GPS_")
     enum GnssAidingData : uint16_t {
         DELETE_EPHEMERIS    = 0x0001,
         DELETE_ALMANAC      = 0x0002,
diff --git a/gnss/1.0/IGnssBatching.hal b/gnss/1.0/IGnssBatching.hal
index 4f0695d..4d5affa 100644
--- a/gnss/1.0/IGnssBatching.hal
+++ b/gnss/1.0/IGnssBatching.hal
@@ -42,6 +42,7 @@
     /*
      * Enum which holds the bit masks for batching control.
      */
+    @export(name="", value_prefix="FLP_BATCH_")
     enum Flag : uint8_t {
         /*
          * If this flag is set, the hardware implementation
diff --git a/gnss/1.0/IGnssCallback.hal b/gnss/1.0/IGnssCallback.hal
index eb66d78..0c3b9f0 100644
--- a/gnss/1.0/IGnssCallback.hal
+++ b/gnss/1.0/IGnssCallback.hal
@@ -23,6 +23,7 @@
  */
 interface IGnssCallback {
     /* Flags for the gnssSetCapabilities callback. */
+    @export(name="", value_prefix="GPS_CAPABILITY_")
     enum Capabilities : uint32_t {
         /*
          * GNSS HAL schedules fixes for RECURRENCE_PERIODIC mode.
@@ -47,6 +48,7 @@
     };
 
     /* GNSS status event values. */
+    @export(name="", value_prefix="GPS_STATUS_")
     enum GnssStatusValue : uint8_t {
         /** GNSS status unknown. */
         NONE           = 0,
@@ -63,6 +65,7 @@
     /*
      * Flags that indicate information about the satellite
      */
+    @export(name="", value_prefix="GNSS_SV_FLAGS_")
     enum GnssSvFlags : uint8_t {
         NONE                  = 0,
         HAS_EPHEMERIS_DATA    = 1 << 0,
@@ -111,9 +114,16 @@
 
         /*
          * Carrier frequency of the signal tracked, for example it can be the
-         * GPS L1 = 1.57542e9 Hz, or L2, L5, varying GLO channels, etc. If
-         * the field is not set, it is the primary common use frequency,
-         * e.g. L1 for GPS.
+         * GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz, L5 =
+         * 1176.45 MHz, varying GLO channels, etc. If the field is not set, it
+         * is the primary common use central frequency, e.g. L1 = 1575.45 MHz
+         * for GPS.
+         *
+         * For an L1, L5 receiver tracking a satellite on L1 and L5 at the same
+         * time, two GnssSvInfo structs must be reported for this same
+         * satellite, in one of the structs, all the values related
+         * to L1 must be filled, and in the other all of the values related to
+         * L5 must be filled.
          *
          * If the data is available, gnssClockFlags must contain
          * HAS_CARRIER_FREQUENCY.
diff --git a/gnss/1.0/IGnssGeofenceCallback.hal b/gnss/1.0/IGnssGeofenceCallback.hal
index 5c70c5e..722317e 100644
--- a/gnss/1.0/IGnssGeofenceCallback.hal
+++ b/gnss/1.0/IGnssGeofenceCallback.hal
@@ -91,17 +91,20 @@
  */
 
 interface IGnssGeofenceCallback {
+    @export(name="", value_prefix="GPS_GEOFENCE_")
     enum GeofenceTransition : int32_t {
         ENTERED   = (1 << 0L),
         EXITED    = (1 << 1L),
         UNCERTAIN = (1 << 2L),
     };
 
+    @export(name="", value_prefix="GPS_GEOFENCE_")
     enum GeofenceAvailability : int32_t {
         UNAVAILABLE = (1 << 0L),
         AVAILABLE   = (1 << 1L),
     };
 
+    @export(name="", value_prefix="GPS_GEOFENCE_")
     enum GeofenceStatus : int32_t {
         OPERATION_SUCCESS        = 0,
         ERROR_TOO_MANY_GEOFENCES = -100,
diff --git a/gnss/1.0/IGnssMeasurement.hal b/gnss/1.0/IGnssMeasurement.hal
index 5174273..8329442 100644
--- a/gnss/1.0/IGnssMeasurement.hal
+++ b/gnss/1.0/IGnssMeasurement.hal
@@ -22,6 +22,7 @@
  * Extended interface for GNSS Measurements support.
  */
 interface IGnssMeasurement {
+    @export(name="", value_prefix="GPS_MEASUREMENT_")
     enum GnssMeasurementStatus : int32_t {
         SUCCESS = 0,
         ERROR_ALREADY_INIT = -100,
diff --git a/gnss/1.0/IGnssMeasurementCallback.hal b/gnss/1.0/IGnssMeasurementCallback.hal
index de640ae..5789621 100644
--- a/gnss/1.0/IGnssMeasurementCallback.hal
+++ b/gnss/1.0/IGnssMeasurementCallback.hal
@@ -21,6 +21,7 @@
     /*
      * Flags to indicate what fields in GnssClock are valid.
      */
+    @export(name="", value_prefix="GNSS_CLOCK_")
     enum GnssClockFlags : uint16_t {
         /** A valid 'leap second' is stored in the data structure. */
         HAS_LEAP_SECOND        = 1 << 0,
@@ -41,6 +42,7 @@
     /*
      * Flags to indicate what fields in GnssMeasurement are valid.
      */
+    @export(name="", value_prefix="GNSS_MEASUREMENT_")
     enum GnssMeasurementFlags : uint32_t {
         /** A valid 'snr' is stored in the data structure. */
         HAS_SNR                        = 1 << 0,
@@ -60,6 +62,7 @@
      * Enumeration of available values for the GNSS Measurement's multipath
      * indicator.
      */
+    @export(name="", value_prefix="GNSS_MULTIPATH_")
     enum GnssMultipathIndicator : uint8_t {
         /** The indicator is not available or unknown. */
         INDICATOR_UNKNOWN      = 0,
@@ -82,6 +85,7 @@
      * If GNSS is still searching for a satellite, the corresponding state must be
      * set to STATE_UNKNOWN(0).
      */
+    @export(name="", value_prefix="GNSS_MEASUREMENT_")
     enum GnssMeasurementState : uint32_t {
         STATE_UNKNOWN                = 0,
         STATE_CODE_LOCK              = 1 << 0,
@@ -105,6 +109,7 @@
     /*
      * Flags indicating the Accumulated Delta Range's states.
      */
+    @export(name="", value_prefix="GNSS_")
     enum GnssAccumulatedDeltaRangeState : uint16_t {
         ADR_STATE_UNKNOWN    = 0,
         ADR_STATE_VALID      = 1 << 0,
@@ -480,9 +485,16 @@
 
         /*
          * Carrier frequency of the signal tracked, for example it can be the
-         * GPS L1 = 1.57542e9 Hz, or L2, L5, varying GLO channels, etc. If the
-         * field is not set, it is the primary common use frequency,
-         * e.g. L1 for GPS.
+         * GPS central frequency for L1 = 1575.45 MHz, or L2 = 1227.60 MHz, L5 =
+         * 1176.45 MHz, varying GLO channels, etc. If the field is not set, it
+         * is the primary common use central frequency, e.g. L1 = 1575.45 MHz
+         * for GPS.
+         *
+         * For an L1, L5 receiver tracking a satellite on L1 and L5 at the same
+         * time, two raw measurement structs must be reported for this same
+         * satellite, in one of the measurement structs, all the values related
+         * to L1 must be filled, and in the other all of the values related to
+         * L5 must be filled.
          *
          * If the data is available, gnssClockFlags must contain
          * HAS_CARRIER_FREQUENCY.
@@ -552,12 +564,12 @@
 
         /*
          * Automatic gain control (AGC) level. AGC acts as a variable gain
-         * amplifier adjusting the power of the incoming signal to minimize the
-         * quantization losses. The AGC level may be used to indicate potential
-         * interference. When AGC is at a nominal level, this value
-         * must be set as 0. Higher gain (and/or lower input power) must be
-         * output as a positive number. Hence in cases of strong jamming, in the
-         * band of this signal, this value must go more negative.
+         * amplifier adjusting the power of the incoming signal. The AGC level
+         * may be used to indicate potential interference. When AGC is at a
+         * nominal level, this value must be set as 0. Higher gain (and/or lower
+         * input power) must be output as a positive number. Hence in cases of
+         * strong jamming, in the band of this signal, this value must go more
+         * negative.
          *
          * Note: Different hardware designs (e.g. antenna, pre-amplification, or
          * other RF HW components) may also affect the typical output of of this
diff --git a/gnss/1.0/IGnssNavigationMessage.hal b/gnss/1.0/IGnssNavigationMessage.hal
index 11f2096..ddd9169 100644
--- a/gnss/1.0/IGnssNavigationMessage.hal
+++ b/gnss/1.0/IGnssNavigationMessage.hal
@@ -22,6 +22,7 @@
  * Extended interface for GNSS navigation message reporting support.
  */
 interface IGnssNavigationMessage {
+    @export(name="", value_prefix="GPS_NAVIGATION_MESSAGE_")
     enum GnssNavigationMessageStatus : int32_t {
         SUCCESS = 0,
         ERROR_ALREADY_INIT = -100,
diff --git a/gnss/1.0/IGnssNavigationMessageCallback.hal b/gnss/1.0/IGnssNavigationMessageCallback.hal
index 0cffa67..2e6b853 100644
--- a/gnss/1.0/IGnssNavigationMessageCallback.hal
+++ b/gnss/1.0/IGnssNavigationMessageCallback.hal
@@ -25,6 +25,7 @@
      * For convenience, first byte is the GnssConstellationType on which that signal
      * is typically transmitted.
      */
+    @export(name="", value_prefix="GNSS_NAVIGATION_MESSAGE_TYPE_")
     enum GnssNavigationMessageType : int16_t {
         UNKNOWN    = 0,
         /** GNSS L1 C/A message contained in the structure.  */
@@ -56,6 +57,7 @@
      * No need to send any navigation message that contains words with parity error
      * and cannot be corrected.
      */
+    @export(name="navigation_message_status", value_prefix="NAV_MESSAGE_STATUS_")
     enum NavigationMessageStatus : uint16_t {
         PARITY_PASSED  = (1 << 0),
         PARITY_REBUILT = (1 << 1),
diff --git a/gnss/1.0/IGnssNiCallback.hal b/gnss/1.0/IGnssNiCallback.hal
index a7abad9..c5fb223 100644
--- a/gnss/1.0/IGnssNiCallback.hal
+++ b/gnss/1.0/IGnssNiCallback.hal
@@ -21,6 +21,7 @@
     /*
      * GnssNiType constants
      */
+    @export(name="", value_prefix="GPS_NI_TYPE_")
     enum GnssNiType : uint8_t {
         VOICE           = 1,
         UMTS_SUPL       = 2,
@@ -30,6 +31,7 @@
     /*
      * GnssNiNotifyFlags constants
      */
+    @export(name="", value_prefix="GPS_NI_")
     enum GnssNiNotifyFlags : uint32_t {
         /** NI requires notification */
         NEED_NOTIFY      = 0x0001,
@@ -43,6 +45,7 @@
      * GNSS NI responses, used to define the response in
      * NI structures
      */
+    @export(name="", value_prefix="GPS_NI_")
     enum GnssUserResponseType : uint8_t {
         RESPONSE_ACCEPT  = 1,
         RESPONSE_DENY    = 2,
@@ -52,6 +55,7 @@
     /*
      * NI data encoding scheme
      */
+    @export(name="", value_prefix="GPS_")
     enum GnssNiEncodingType : int32_t {
         ENC_NONE              = 0,
         ENC_SUPL_GSM_DEFAULT  = 1,
diff --git a/gnss/1.0/types.hal b/gnss/1.0/types.hal
index 2721d44..d5e0e9b 100644
--- a/gnss/1.0/types.hal
+++ b/gnss/1.0/types.hal
@@ -16,6 +16,7 @@
 
 package android.hardware.gnss@1.0;
 
+@export(name="", value_prefix="GNSS_MAX_")
 enum GnssMax : uint32_t {
 /** Maximum number of SVs for gnssSvStatusCb(). */
     SVS_COUNT = 64,
@@ -27,6 +28,8 @@
 /*
  * Constellation type of GnssSvInfo
  */
+
+@export(name="", value_prefix="GNSS_CONSTELLATION_")
 enum GnssConstellationType : uint8_t {
     UNKNOWN = 0,
     GPS     = 1,
@@ -38,6 +41,7 @@
 };
 
 /** Bit mask to indicate which values are valid in a GnssLocation object. */
+@export(name="", value_prefix="GPS_LOCATION_")
 enum GnssLocationFlags : uint16_t {
     /** GnssLocation has valid latitude and longitude. */
     HAS_LAT_LONG              = 0x0001,
diff --git a/graphics/common/1.0/types.hal b/graphics/common/1.0/types.hal
index ebdba77..6fddfaf 100644
--- a/graphics/common/1.0/types.hal
+++ b/graphics/common/1.0/types.hal
@@ -1264,7 +1264,7 @@
    *  red             0.680   0.320
    *  white (D65)     0.3127  0.3290
    *
-   * Gamma: 2.2
+   * Gamma: 2.6
    */
   DCI_P3 = 6,
 
@@ -1309,7 +1309,27 @@
    *
    * Gamma: 2.2
    */
-  ADOBE_RGB = 8
+  ADOBE_RGB = 8,
+
+  /*
+   * DISPLAY_P3 is a color space that uses the DCI_P3 primaries,
+   * the D65 white point and the SRGB transfer functions.
+   * Rendering Intent: Colorimetric
+   * Primaries:
+   *                  x       y
+   *  green           0.265   0.690
+   *  blue            0.150   0.060
+   *  red             0.680   0.320
+   *  white (D65)     0.3127  0.3290
+   *
+   * PC/Internet (sRGB) Gamma Correction (GC):
+   *
+   *  if Vlinear ≤ 0.0031308
+   *    Vnonlinear = 12.92 * Vlinear
+   *  else
+   *    Vnonlinear = 1.055 * (Vlinear)^(1/2.4) – 0.055
+   */
+  DISPLAY_P3 = 9
 };
 
 /*
diff --git a/graphics/composer/2.1/default/HwcClient.cpp b/graphics/composer/2.1/default/HwcClient.cpp
index 54dfd89..edd161a 100644
--- a/graphics/composer/2.1/default/HwcClient.cpp
+++ b/graphics/composer/2.1/default/HwcClient.cpp
@@ -514,7 +514,7 @@
     if (outDescriptor) {
         hidl_cb(Error::NONE, *outDescriptor);
     } else {
-        hidl_cb(Error::NO_RESOURCES, MQDescriptorSync<uint32_t>());
+        hidl_cb(Error::NO_RESOURCES, CommandQueueType::Descriptor());
     }
 
     return Void();
@@ -651,7 +651,7 @@
 
 bool HwcClient::CommandReader::parseSelectDisplay(uint16_t length)
 {
-    if (length != CommandWriter::kSelectDisplayLength) {
+    if (length != CommandWriterBase::kSelectDisplayLength) {
         return false;
     }
 
@@ -663,7 +663,7 @@
 
 bool HwcClient::CommandReader::parseSelectLayer(uint16_t length)
 {
-    if (length != CommandWriter::kSelectLayerLength) {
+    if (length != CommandWriterBase::kSelectLayerLength) {
         return false;
     }
 
@@ -674,7 +674,7 @@
 
 bool HwcClient::CommandReader::parseSetColorTransform(uint16_t length)
 {
-    if (length != CommandWriter::kSetColorTransformLength) {
+    if (length != CommandWriterBase::kSetColorTransformLength) {
         return false;
     }
 
@@ -722,7 +722,7 @@
 
 bool HwcClient::CommandReader::parseSetOutputBuffer(uint16_t length)
 {
-    if (length != CommandWriter::kSetOutputBufferLength) {
+    if (length != CommandWriterBase::kSetOutputBufferLength) {
         return false;
     }
 
@@ -746,7 +746,7 @@
 
 bool HwcClient::CommandReader::parseValidateDisplay(uint16_t length)
 {
-    if (length != CommandWriter::kValidateDisplayLength) {
+    if (length != CommandWriterBase::kValidateDisplayLength) {
         return false;
     }
 
@@ -773,7 +773,7 @@
 
 bool HwcClient::CommandReader::parseAcceptDisplayChanges(uint16_t length)
 {
-    if (length != CommandWriter::kAcceptDisplayChangesLength) {
+    if (length != CommandWriterBase::kAcceptDisplayChangesLength) {
         return false;
     }
 
@@ -787,7 +787,7 @@
 
 bool HwcClient::CommandReader::parsePresentDisplay(uint16_t length)
 {
-    if (length != CommandWriter::kPresentDisplayLength) {
+    if (length != CommandWriterBase::kPresentDisplayLength) {
         return false;
     }
 
@@ -807,7 +807,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerCursorPosition(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerCursorPositionLength) {
+    if (length != CommandWriterBase::kSetLayerCursorPositionLength) {
         return false;
     }
 
@@ -822,7 +822,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerBuffer(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerBufferLength) {
+    if (length != CommandWriterBase::kSetLayerBufferLength) {
         return false;
     }
 
@@ -862,7 +862,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerBlendMode(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerBlendModeLength) {
+    if (length != CommandWriterBase::kSetLayerBlendModeLength) {
         return false;
     }
 
@@ -876,7 +876,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerColor(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerColorLength) {
+    if (length != CommandWriterBase::kSetLayerColorLength) {
         return false;
     }
 
@@ -890,7 +890,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerCompositionType(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerCompositionTypeLength) {
+    if (length != CommandWriterBase::kSetLayerCompositionTypeLength) {
         return false;
     }
 
@@ -904,7 +904,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerDataspace(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerDataspaceLength) {
+    if (length != CommandWriterBase::kSetLayerDataspaceLength) {
         return false;
     }
 
@@ -918,7 +918,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerDisplayFrame(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerDisplayFrameLength) {
+    if (length != CommandWriterBase::kSetLayerDisplayFrameLength) {
         return false;
     }
 
@@ -932,7 +932,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerPlaneAlpha(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerPlaneAlphaLength) {
+    if (length != CommandWriterBase::kSetLayerPlaneAlphaLength) {
         return false;
     }
 
@@ -946,7 +946,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerSidebandStream(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerSidebandStreamLength) {
+    if (length != CommandWriterBase::kSetLayerSidebandStreamLength) {
         return false;
     }
 
@@ -965,7 +965,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerSourceCrop(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerSourceCropLength) {
+    if (length != CommandWriterBase::kSetLayerSourceCropLength) {
         return false;
     }
 
@@ -979,7 +979,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerTransform(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerTransformLength) {
+    if (length != CommandWriterBase::kSetLayerTransformLength) {
         return false;
     }
 
@@ -1009,7 +1009,7 @@
 
 bool HwcClient::CommandReader::parseSetLayerZOrder(uint16_t length)
 {
-    if (length != CommandWriter::kSetLayerZOrderLength) {
+    if (length != CommandWriterBase::kSetLayerZOrderLength) {
         return false;
     }
 
diff --git a/graphics/composer/2.1/default/HwcClient.h b/graphics/composer/2.1/default/HwcClient.h
index c719774..35a0450 100644
--- a/graphics/composer/2.1/default/HwcClient.h
+++ b/graphics/composer/2.1/default/HwcClient.h
@@ -171,7 +171,7 @@
 
         HwcClient& mClient;
         HwcHal& mHal;
-        CommandWriter& mWriter;
+        CommandWriterBase& mWriter;
 
         Display mDisplay;
         Layer mLayer;
@@ -184,7 +184,7 @@
         64 * 1024 / sizeof(uint32_t) - 16;
     std::mutex mCommandMutex;
     CommandReader mReader;
-    CommandWriter mWriter;
+    CommandWriterBase mWriter;
 
     sp<IComposerCallback> mCallback;
 
diff --git a/graphics/composer/2.1/default/IComposerCommandBuffer.h b/graphics/composer/2.1/default/IComposerCommandBuffer.h
index 65e7799..fb78ef8 100644
--- a/graphics/composer/2.1/default/IComposerCommandBuffer.h
+++ b/graphics/composer/2.1/default/IComposerCommandBuffer.h
@@ -52,16 +52,16 @@
 
 // This class helps build a command queue.  Note that all sizes/lengths are in
 // units of uint32_t's.
-class CommandWriter {
+class CommandWriterBase {
 public:
-    CommandWriter(uint32_t initialMaxSize)
+    CommandWriterBase(uint32_t initialMaxSize)
         : mDataMaxSize(initialMaxSize)
     {
         mData = std::make_unique<uint32_t[]>(mDataMaxSize);
         reset();
     }
 
-    ~CommandWriter()
+    virtual ~CommandWriterBase()
     {
         reset();
     }
diff --git a/ir/1.0/Android.bp b/ir/1.0/Android.bp
index 3a8fceb..fb9f070 100644
--- a/ir/1.0/Android.bp
+++ b/ir/1.0/Android.bp
@@ -54,3 +54,106 @@
         "android.hidl.base@1.0",
     ],
 }
+
+genrule {
+    name: "android.hardware.ir.vts.driver@1.0_genc++",
+    tools: ["hidl-gen", "vtsc"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lvts -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.ir@1.0 && $(location vtsc) -mDRIVER -tSOURCE -b$(genDir) android/hardware/ir/1.0/ $(genDir)/android/hardware/ir/1.0/",
+    srcs: [
+        "types.hal",
+        "IConsumerIr.hal",
+    ],
+    out: [
+        "android/hardware/ir/1.0/types.vts.cpp",
+        "android/hardware/ir/1.0/ConsumerIr.vts.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.ir.vts.driver@1.0_genc++_headers",
+    tools: ["hidl-gen", "vtsc"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lvts -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.ir@1.0 && $(location vtsc) -mDRIVER -tHEADER -b$(genDir) android/hardware/ir/1.0/ $(genDir)/android/hardware/ir/1.0/",
+    srcs: [
+        "types.hal",
+        "IConsumerIr.hal",
+    ],
+    out: [
+        "android/hardware/ir/1.0/types.vts.h",
+        "android/hardware/ir/1.0/ConsumerIr.vts.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.ir.vts.driver@1.0",
+    generated_sources: ["android.hardware.ir.vts.driver@1.0_genc++"],
+    generated_headers: ["android.hardware.ir.vts.driver@1.0_genc++_headers"],
+    export_generated_headers: ["android.hardware.ir.vts.driver@1.0_genc++_headers"],
+    shared_libs: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "libcutils",
+        "libvts_common",
+        "libvts_datatype",
+        "libvts_measurement",
+        "libvts_multidevice_proto",
+        "libcamera_metadata",
+        "libprotobuf-cpp-full",
+        "android.hidl.base@1.0",
+        "android.hardware.ir@1.0",
+    ],
+    export_shared_lib_headers: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hidl.base@1.0",
+    ],
+}
+
+genrule {
+    name: "android.hardware.ir@1.0-IConsumerIr-vts.profiler_genc++",
+    tools: ["hidl-gen", "vtsc"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lvts -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.ir@1.0 && $(location vtsc) -mPROFILER -tSOURCE -b$(genDir) android/hardware/ir/1.0/ $(genDir)/android/hardware/ir/1.0/",
+    srcs: [
+        "IConsumerIr.hal",
+        "types.hal",
+    ],
+    out: [
+        "android/hardware/ir/1.0/ConsumerIr.vts.cpp",
+        "android/hardware/ir/1.0/types.vts.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.ir@1.0-IConsumerIr-vts.profiler_genc++_headers",
+    tools: ["hidl-gen", "vtsc"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lvts -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.ir@1.0 && $(location vtsc) -mPROFILER -tHEADER -b$(genDir) android/hardware/ir/1.0/ $(genDir)/android/hardware/ir/1.0/",
+    srcs: [
+        "IConsumerIr.hal",
+        "types.hal",
+    ],
+    out: [
+        "android/hardware/ir/1.0/ConsumerIr.vts.h",
+        "android/hardware/ir/1.0/types.vts.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.ir@1.0-IConsumerIr-vts.profiler",
+    generated_sources: ["android.hardware.ir@1.0-IConsumerIr-vts.profiler_genc++"],
+    generated_headers: ["android.hardware.ir@1.0-IConsumerIr-vts.profiler_genc++_headers"],
+    export_generated_headers: ["android.hardware.ir@1.0-IConsumerIr-vts.profiler_genc++_headers"],
+    shared_libs: [
+        "libbase",
+        "libhidlbase",
+        "libhidltransport",
+        "libvts_profiling",
+        "libvts_multidevice_proto",
+        "libprotobuf-cpp-full",
+        "android.hidl.base@1.0",
+        "android.hardware.ir@1.0",
+    ],
+}
diff --git a/ir/1.0/vts/Android.mk b/ir/1.0/vts/Android.mk
new file mode 100644
index 0000000..90c50c8
--- /dev/null
+++ b/ir/1.0/vts/Android.mk
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(LOCAL_PATH)/functional/vts/testcases/hal/ir/hidl/target/Android.mk
diff --git a/ir/1.0/vts/ConsumerIr.vts b/ir/1.0/vts/ConsumerIr.vts
new file mode 100644
index 0000000..bebc6cf
--- /dev/null
+++ b/ir/1.0/vts/ConsumerIr.vts
@@ -0,0 +1,44 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "IConsumerIr"
+
+package: "android.hardware.ir"
+
+import: "android.hardware.ir@1.0::types"
+
+interface: {
+    api: {
+        name: "transmit"
+        return_type_hidl: {
+            type: TYPE_SCALAR
+            scalar_type: "bool_t"
+        }
+        arg: {
+            type: TYPE_SCALAR
+            scalar_type: "int32_t"
+        }
+        arg: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_SCALAR
+                scalar_type: "int32_t"
+            }
+        }
+    }
+
+    api: {
+        name: "getCarrierFreqs"
+        return_type_hidl: {
+            type: TYPE_SCALAR
+            scalar_type: "bool_t"
+        }
+        return_type_hidl: {
+            type: TYPE_VECTOR
+            vector_value: {
+                type: TYPE_STRUCT
+                predefined_type: "::android::hardware::ir::V1_0::ConsumerIrFreqRange"
+            }
+        }
+    }
+
+}
diff --git a/ir/1.0/vts/functional/Android.bp b/ir/1.0/vts/functional/Android.bp
new file mode 100644
index 0000000..c5265de
--- /dev/null
+++ b/ir/1.0/vts/functional/Android.bp
@@ -0,0 +1,40 @@
+//
+// 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.
+//
+
+cc_test {
+    name: "ir_hidl_hal_test",
+    gtest: true,
+    srcs: ["ir_hidl_hal_test.cpp"],
+    shared_libs: [
+        "libbase",
+        "liblog",
+        "libcutils",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hardware.ir@1.0",
+    ],
+    static_libs: ["libgtest"],
+    cflags: [
+        "--coverage",
+        "-O0",
+        "-g",
+    ],
+    ldflags: [
+        "--coverage"
+    ]
+}
diff --git a/ir/1.0/vts/functional/ir_hidl_hal_test.cpp b/ir/1.0/vts/functional/ir_hidl_hal_test.cpp
new file mode 100644
index 0000000..08c7974
--- /dev/null
+++ b/ir/1.0/vts/functional/ir_hidl_hal_test.cpp
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+#define LOG_TAG "ir_hidl_hal_test"
+
+#include <android-base/logging.h>
+
+#include <android/hardware/ir/1.0/IConsumerIr.h>
+#include <android/hardware/ir/1.0/types.h>
+
+#include <gtest/gtest.h>
+#include <algorithm>
+
+using ::android::hardware::ir::V1_0::IConsumerIr;
+using ::android::hardware::ir::V1_0::ConsumerIrFreqRange;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::sp;
+
+// The main test class for IR HIDL HAL.
+class ConsumerIrHidlTest : public ::testing::Test {
+ public:
+  virtual void SetUp() override {
+    ir = IConsumerIr::getService();
+    ASSERT_NE(ir, nullptr);
+  }
+
+  virtual void TearDown() override {}
+
+  sp<IConsumerIr> ir;
+};
+
+// Test transmit() for the min and max frequency of every available range
+TEST_F(ConsumerIrHidlTest, TransmitTest) {
+  int32_t freqs;
+  bool success;
+  hidl_vec<ConsumerIrFreqRange> ranges;
+  auto cb = [&](bool s, hidl_vec<ConsumerIrFreqRange> v) {
+    ranges = v;
+    success = s;
+  };
+  Return<void> ret = ir->getCarrierFreqs(cb);
+  ASSERT_TRUE(ret.isOk());
+  ASSERT_TRUE(success);
+
+  if (ranges.size() > 0) {
+    uint32_t len = 16;
+    hidl_vec<int32_t> vec;
+    vec.resize(len);
+    std::fill(vec.begin(), vec.end(), 1);
+    for (auto range = ranges.begin(); range != ranges.end(); range++) {
+      EXPECT_TRUE(ir->transmit(range->min, vec));
+      EXPECT_TRUE(ir->transmit(range->max, vec));
+    }
+  }
+}
+
+// Test transmit() when called with invalid frequencies
+TEST_F(ConsumerIrHidlTest, BadFreqTest) {
+  uint32_t len = 16;
+  hidl_vec<int32_t> vec;
+  vec.resize(len);
+  std::fill(vec.begin(), vec.end(), 1);
+  EXPECT_FALSE(ir->transmit(-1, vec));
+  EXPECT_FALSE(ir->transmit(0, vec));
+}
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+  int status = RUN_ALL_TESTS();
+  LOG(INFO) << "Test result = " << status;
+  return status;
+}
diff --git a/ir/1.0/vts/functional/vts/testcases/hal/ir/hidl/target/Android.mk b/ir/1.0/vts/functional/vts/testcases/hal/ir/hidl/target/Android.mk
new file mode 100644
index 0000000..a69fd08
--- /dev/null
+++ b/ir/1.0/vts/functional/vts/testcases/hal/ir/hidl/target/Android.mk
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := HalIrHidlTargetTest
+VTS_CONFIG_SRC_DIR := testcases/hal/ir/hidl/target
+include test/vts/tools/build/Android.host_config.mk
diff --git a/ir/1.0/vts/functional/vts/testcases/hal/ir/hidl/target/AndroidTest.xml b/ir/1.0/vts/functional/vts/testcases/hal/ir/hidl/target/AndroidTest.xml
new file mode 100644
index 0000000..bf3d236
--- /dev/null
+++ b/ir/1.0/vts/functional/vts/testcases/hal/ir/hidl/target/AndroidTest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<configuration description="Config for VTS IR HIDL HAL's target-side test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="HalIrHidlTargetTest"/>
+        <option name="binary-test-sources" value="
+            _32bit::DATA/nativetest/ir_hidl_hal_test/ir_hidl_hal_test,
+            _64bit::DATA/nativetest64/ir_hidl_hal_test/ir_hidl_hal_test,
+            "/>
+        <option name="binary-test-type" value="hal_hidl_gtest" />
+        <option name="precondition-hwbinder-service" value="android.hardware.ir" />
+        <option name="test-timeout" value="1m" />
+    </test>
+</configuration>
diff --git a/ir/1.0/vts/types.vts b/ir/1.0/vts/types.vts
new file mode 100644
index 0000000..d308b1f
--- /dev/null
+++ b/ir/1.0/vts/types.vts
@@ -0,0 +1,21 @@
+component_class: HAL_HIDL
+component_type_version: 1.0
+component_name: "types"
+
+package: "android.hardware.ir"
+
+
+attribute: {
+    name: "::android::hardware::ir::V1_0::ConsumerIrFreqRange"
+    type: TYPE_STRUCT
+    struct_value: {
+        name: "min"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+    struct_value: {
+        name: "max"
+        type: TYPE_SCALAR
+        scalar_type: "uint32_t"
+    }
+}
\ No newline at end of file
diff --git a/ir/Android.bp b/ir/Android.bp
index ba90f2c..ed19a37 100644
--- a/ir/Android.bp
+++ b/ir/Android.bp
@@ -2,4 +2,5 @@
 subdirs = [
     "1.0",
     "1.0/default",
+    "1.0/vts/functional",
 ]
diff --git a/ir/Android.mk b/ir/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/ir/Android.mk
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/keymaster/3.0/IKeymasterDevice.hal b/keymaster/3.0/IKeymasterDevice.hal
index 19669c8..50a41ec 100644
--- a/keymaster/3.0/IKeymasterDevice.hal
+++ b/keymaster/3.0/IKeymasterDevice.hal
@@ -209,6 +209,21 @@
     deleteAllKeys() generates(ErrorCode error);
 
     /**
+     * Destroys knowledge of the device's ids. This prevents all device id attestation in the
+     * future. The destruction must be permanent so that not even a factory reset will restore the
+     * device ids.
+     *
+     * Device id attestation may be provided only if this method is fully implemented, allowing the
+     * user to permanently disable device id attestation. If this cannot be guaranteed, the device
+     * must never attest any device ids.
+     *
+     * This is a NOP if device id attestation is not supported.
+     *
+     * @return error See the ErrorCode enum.
+     */
+    destroyAttestationIds() generates(ErrorCode error);
+
+    /**
      * Begins a cryptographic operation using the specified key. If all is well, begin() will return
      * ErrorCode::OK and create an operation handle which must be passed to subsequent calls to
      * update(), finish() or abort().
diff --git a/keymaster/3.0/default/KeymasterDevice.cpp b/keymaster/3.0/default/KeymasterDevice.cpp
index 1208b8d..563ff84 100644
--- a/keymaster/3.0/default/KeymasterDevice.cpp
+++ b/keymaster/3.0/default/KeymasterDevice.cpp
@@ -516,6 +516,24 @@
 
     hidl_vec<hidl_vec<uint8_t>> resultCertChain;
 
+    for (size_t i = 0; i < attestParams.size(); ++i) {
+        switch (attestParams[i].tag) {
+            case Tag::ATTESTATION_ID_BRAND:
+            case Tag::ATTESTATION_ID_DEVICE:
+            case Tag::ATTESTATION_ID_PRODUCT:
+            case Tag::ATTESTATION_ID_SERIAL:
+            case Tag::ATTESTATION_ID_IMEI:
+            case Tag::ATTESTATION_ID_MEID:
+                // Device id attestation may only be supported if the device is able to permanently
+                // destroy its knowledge of the ids. This device is unable to do this, so it must
+                // never perform any device id attestation.
+                _hidl_cb(ErrorCode::CANNOT_ATTEST_IDS, resultCertChain);
+                return Void();
+            default:
+                break;
+        }
+    }
+
     keymaster_cert_chain_t cert_chain{nullptr, 0};
 
     auto kmKeyToAttest = hidlVec2KmKeyBlob(keyToAttest);
@@ -569,9 +587,16 @@
 }
 
 Return<ErrorCode> KeymasterDevice::deleteAllKeys() {
+    if (keymaster_device_->delete_all_keys == nullptr) {
+        return ErrorCode::UNIMPLEMENTED;
+    }
     return legacy_enum_conversion(keymaster_device_->delete_all_keys(keymaster_device_));
 }
 
+Return<ErrorCode> KeymasterDevice::destroyAttestationIds() {
+    return ErrorCode::UNIMPLEMENTED;
+}
+
 Return<void> KeymasterDevice::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
                                     const hidl_vec<KeyParameter>& inParams, begin_cb _hidl_cb) {
 
diff --git a/keymaster/3.0/default/KeymasterDevice.h b/keymaster/3.0/default/KeymasterDevice.h
index 23767ef..382f45f 100644
--- a/keymaster/3.0/default/KeymasterDevice.h
+++ b/keymaster/3.0/default/KeymasterDevice.h
@@ -71,6 +71,7 @@
                             upgradeKey_cb _hidl_cb) override;
     Return<ErrorCode> deleteKey(const hidl_vec<uint8_t>& keyBlob) override;
     Return<ErrorCode> deleteAllKeys() override;
+    Return<ErrorCode> destroyAttestationIds() override;
     Return<void> begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
                        const hidl_vec<KeyParameter>& inParams, begin_cb _hidl_cb) override;
     Return<void> update(uint64_t operationHandle, const hidl_vec<KeyParameter>& inParams,
diff --git a/keymaster/3.0/types.hal b/keymaster/3.0/types.hal
index e99e9c8..9f29b6a 100644
--- a/keymaster/3.0/types.hal
+++ b/keymaster/3.0/types.hal
@@ -123,6 +123,19 @@
     ATTESTATION_APPLICATION_ID = TagType:BYTES | 709, /* Used to identify the set of possible
                                                        * applications of which one has initiated a
                                                        * key attestation */
+    ATTESTATION_ID_BRAND = TagType:BYTES | 710,  /* Used to provide the device's brand name to be
+                                                    included in attestation */
+    ATTESTATION_ID_DEVICE = TagType:BYTES | 711, /* Used to provide the device's device name to be
+                                                    included in attestation */
+    ATTESTATION_ID_PRODUCT = TagType:BYTES | 712, /* Used to provide the device's product name to be
+                                                     included in attestation */
+    ATTESTATION_ID_SERIAL = TagType:BYTES | 713, /* Used to provide the device's serial number to be
+                                                    included in attestation */
+    ATTESTATION_ID_IMEI = TagType:BYTES | 714,   /* Used to provide the device's IMEI to be included
+                                                    in attestation */
+    ATTESTATION_ID_MEID = TagType:BYTES | 715,   /* Used to provide the device's MEID to be included
+                                                    in attestation */
+
 
     /* Tags used only to provide data to or receive data from operations */
     ASSOCIATED_DATA = TagType:BYTES | 1000, /* Used to provide associated data for AEAD modes. */
@@ -241,6 +254,7 @@
     SIGN = 2,       /* Usable with RSA, EC and HMAC keys. */
     VERIFY = 3,     /* Usable with RSA, EC and HMAC keys. */
     DERIVE_KEY = 4, /* Usable with EC keys. */
+    WRAP_KEY = 5,   /* Usable with wrapping keys. */
 };
 
 /**
@@ -311,6 +325,7 @@
     ATTESTATION_CHALLENGE_MISSING = -63,
     KEYMASTER_NOT_CONFIGURED = -64,
     ATTESTATION_APPLICATION_ID_MISSING = -65,
+    CANNOT_ATTEST_IDS = -66,
 
     UNIMPLEMENTED = -100,
     VERSION_MISMATCH = -101,
diff --git a/light/2.0/default/service.cpp b/light/2.0/default/service.cpp
index b3848e9..70ae565 100644
--- a/light/2.0/default/service.cpp
+++ b/light/2.0/default/service.cpp
@@ -23,5 +23,5 @@
 using android::hardware::defaultPassthroughServiceImplementation;
 
 int main() {
-    return defaultPassthroughServiceImplementation<ILight>("light");
+    return defaultPassthroughServiceImplementation<ILight>();
 }
diff --git a/light/2.0/vts/functional/light_hidl_hal_test.cpp b/light/2.0/vts/functional/light_hidl_hal_test.cpp
index 9b9f543..71a8b4e 100644
--- a/light/2.0/vts/functional/light_hidl_hal_test.cpp
+++ b/light/2.0/vts/functional/light_hidl_hal_test.cpp
@@ -34,15 +34,13 @@
 using ::android::hardware::Void;
 using ::android::sp;
 
-#define LIGHT_SERVICE_NAME "light"
-
 #define ASSERT_OK(ret) ASSERT_TRUE(ret.isOk())
 #define EXPECT_OK(ret) EXPECT_TRUE(ret.isOk())
 
 class LightHidlTest : public ::testing::Test {
 public:
     virtual void SetUp() override {
-        light = ILight::getService(LIGHT_SERVICE_NAME);
+        light = ILight::getService();
 
         ASSERT_NE(light, nullptr);
         LOG(INFO) << "Test is remote " << light->isRemote();
diff --git a/memtrack/1.0/default/Memtrack.cpp b/memtrack/1.0/default/Memtrack.cpp
index 5c1a5c4..cc2d341 100644
--- a/memtrack/1.0/default/Memtrack.cpp
+++ b/memtrack/1.0/default/Memtrack.cpp
@@ -29,7 +29,7 @@
 namespace V1_0 {
 namespace implementation {
 
-Memtrack::Memtrack(memtrack_module_t *module) : mModule(module) {
+Memtrack::Memtrack(const memtrack_module_t *module) : mModule(module) {
     if (mModule)
         mModule->init(mModule);
 }
@@ -74,25 +74,25 @@
 
 
 IMemtrack* HIDL_FETCH_IMemtrack(const char* name) {
-    int ret = 0;
-    const hw_module_t* hw_module = NULL;
-    memtrack_module_t *memtrack_module = NULL;
+    const hw_module_t* hw_module = nullptr;
+    const memtrack_module_t* memtrack_module = nullptr;
+    int err = hw_get_module(name, &hw_module);
+    if (err) {
+        ALOGE ("hw_get_module %s failed: %d", name, err);
+        return nullptr;
+    }
 
-    ret = hw_get_module(name, &hw_module);
-    if (ret == 0 && hw_module->methods->open > 0)
-    {
-        ret = hw_module->methods->open(hw_module, name,
-                reinterpret_cast<hw_device_t**>(&memtrack_module));
-        if (ret == 0)
-                return new Memtrack(memtrack_module);
-        else {
+    if (!hw_module->methods || !hw_module->methods->open) {
+        memtrack_module = reinterpret_cast<const memtrack_module_t*>(hw_module);
+    } else {
+        err = hw_module->methods->open(hw_module, name,
+                reinterpret_cast<hw_device_t**>(const_cast<memtrack_module_t**>(&memtrack_module)));
+        if (err) {
             ALOGE("Passthrough failed to load legacy HAL.");
+            return nullptr;
         }
     }
-    else {
-        ALOGE ("hw_get_module %s failed: %d", name, ret);
-    }
-    return nullptr;
+    return new Memtrack(memtrack_module);
 }
 
 } // namespace implementation
diff --git a/memtrack/1.0/default/Memtrack.h b/memtrack/1.0/default/Memtrack.h
index a3c55e4..0adba76 100644
--- a/memtrack/1.0/default/Memtrack.h
+++ b/memtrack/1.0/default/Memtrack.h
@@ -38,12 +38,12 @@
 using ::android::sp;
 
 struct Memtrack : public IMemtrack {
-    Memtrack(memtrack_module_t* module);
+    Memtrack(const memtrack_module_t* module);
     ~Memtrack();
     Return<void> getMemory(int32_t pid, MemtrackType type, getMemory_cb _hidl_cb)  override;
 
   private:
-    memtrack_module_t* mModule;
+    const memtrack_module_t* mModule;
 };
 
 extern "C" IMemtrack* HIDL_FETCH_IMemtrack(const char* name);
diff --git a/nfc/1.0/vts/functional/nfc_hidl_hal_test.cpp b/nfc/1.0/vts/functional/nfc_hidl_hal_test.cpp
index 521f17f..a50d88f 100644
--- a/nfc/1.0/vts/functional/nfc_hidl_hal_test.cpp
+++ b/nfc/1.0/vts/functional/nfc_hidl_hal_test.cpp
@@ -53,13 +53,11 @@
 #define VERSION 0x11
 #define TIMEOUT_PERIOD 5
 
-static bool passthrough = true;
-
 // The main test class for NFC HIDL HAL.
 class NfcHidlTest : public ::testing::Test {
  public:
   virtual void SetUp() override {
-    nfc_ = INfc::getService(passthrough);
+    nfc_ = INfc::getService();
     ASSERT_NE(nfc_, nullptr);
 
     nfc_cb_ = new NfcClientCallback(*this);
@@ -336,12 +334,6 @@
   ::testing::AddGlobalTestEnvironment(new NfcHidlEnvironment);
   ::testing::InitGoogleTest(&argc, argv);
 
-  for (int i = 0; i < argc; i++) {
-    if (strstr(argv[i], "passthrough=false") != nullptr) {
-      passthrough = false;
-      break;
-    }
-  }
   std::system("svc nfc disable"); /* Turn off NFC */
   sleep(5);
 
diff --git a/power/1.0/default/Power.cpp b/power/1.0/default/Power.cpp
index 656a2ae..2ddac0a 100644
--- a/power/1.0/default/Power.cpp
+++ b/power/1.0/default/Power.cpp
@@ -40,14 +40,14 @@
 
 // Methods from ::android::hardware::power::V1_0::IPower follow.
 Return<void> Power::setInteractive(bool interactive)  {
-    if (mModule->setInteractive > 0)
+    if (mModule->setInteractive)
         mModule->setInteractive(mModule, interactive ? 1 : 0);
     return Void();
 }
 
 Return<void> Power::powerHint(PowerHint hint, int32_t data)  {
     int32_t param = data;
-    if (mModule->powerHint > 0) {
+    if (mModule->powerHint) {
         if (data)
             mModule->powerHint(mModule, static_cast<power_hint_t>(hint), &param);
         else
@@ -57,7 +57,7 @@
 }
 
 Return<void> Power::setFeature(Feature feature, bool activate)  {
-    if (mModule->setFeature > 0)
+    if (mModule->setFeature)
         mModule->setFeature(mModule, static_cast<feature_t>(feature),
                 activate ? 1 : 0);
     return Void();
@@ -79,7 +79,7 @@
     }
 
     number_platform_modes = mModule->get_number_of_platform_modes(mModule);
-    if (number_platform_modes > 0)
+    if (number_platform_modes)
     {
        if (SIZE_MAX / sizeof(size_t) <= number_platform_modes)  // overflow
            goto done;
@@ -144,24 +144,24 @@
     return Void();
 }
 
-IPower* HIDL_FETCH_IPower(const char* name) {
+IPower* HIDL_FETCH_IPower(const char* /* name */) {
     int ret = 0;
     const hw_module_t* hw_module = NULL;
     power_module_t *power_module;
-    ret = hw_get_module(name, &hw_module);
-    if (ret == 0 && hw_module->methods->open > 0) {
-        ret = hw_module->methods->open(hw_module, name,
+    ret = hw_get_module(POWER_HARDWARE_MODULE_ID, &hw_module);
+    if (ret == 0 && hw_module->methods->open) {
+        ret = hw_module->methods->open(hw_module, POWER_HARDWARE_MODULE_ID,
                 reinterpret_cast<hw_device_t**>(&power_module));
         if (ret == 0) {
             return new Power(power_module);
         }
         else {
-            ALOGE("Passthrough failed to load legacy HAL.");
+            ALOGE("Passthrough failed to load legacy power HAL.");
             return nullptr;
         }
     }
     else {
-        ALOGE ("hw_get_module %s failed: %d", name, ret);
+        ALOGE ("hw_get_module %s failed: %d", POWER_HARDWARE_MODULE_ID, ret);
         return nullptr;
     }
 }
diff --git a/power/1.0/default/service.cpp b/power/1.0/default/service.cpp
index f77ff5b..e8618b8 100644
--- a/power/1.0/default/service.cpp
+++ b/power/1.0/default/service.cpp
@@ -23,5 +23,5 @@
 using android::hardware::defaultPassthroughServiceImplementation;
 
 int main() {
-    return defaultPassthroughServiceImplementation<IPower>("power");
+    return defaultPassthroughServiceImplementation<IPower>();
 }
diff --git a/power/1.0/vts/functional/power_hidl_hal_test.cpp b/power/1.0/vts/functional/power_hidl_hal_test.cpp
index 36bdb0a..3f0ef56 100644
--- a/power/1.0/vts/functional/power_hidl_hal_test.cpp
+++ b/power/1.0/vts/functional/power_hidl_hal_test.cpp
@@ -35,7 +35,7 @@
 class PowerHidlTest : public ::testing::Test {
  public:
   virtual void SetUp() override {
-    power = IPower::getService("power");
+    power = IPower::getService();
     ASSERT_NE(power, nullptr);
   }
 
diff --git a/radio/1.0/types.hal b/radio/1.0/types.hal
index 941a59e..593dc92 100644
--- a/radio/1.0/types.hal
+++ b/radio/1.0/types.hal
@@ -109,8 +109,8 @@
     INVALID_SMSC_ADDRESS = 58,            // SMSC address specified is invalid
     NO_SUCH_ENTRY = 59,                   // No such entry present to perform the request
     NETWORK_NOT_READY = 60,               // Network is not ready to perform the request
-    NOT_PROVISIONED = 61,                 // Device doesnot have this value provisioned
-    NO_SUBSCRIPTION = 62,                 // Device doesnot have subscription
+    NOT_PROVISIONED = 61,                 // Device does not have this value provisioned
+    NO_SUBSCRIPTION = 62,                 // Device does not have subscription
     NO_NETWORK_FOUND = 63,                // Network cannot be found
     DEVICE_IN_USE = 64,                   // Operation cannot be performed because the device
                                           // is currently in use
@@ -223,7 +223,7 @@
     RUIM_CORPORATE,
     RUIM_SERVICE_PROVIDER,
     RUIM_RUIM,
-    RUIM_NETWORK1_PUK,                   // The corresponding perso lock is blocked
+    RUIM_NETWORK1_PUK,                    // The corresponding perso lock is blocked
     RUIM_NETWORK2_PUK,
     RUIM_HRPD_PUK,
     RUIM_CORPORATE_PUK,
@@ -232,7 +232,7 @@
 };
 
 enum RadioState : int32_t {
-    OFF = 0,                              // Radio explictly powered off (eg CFUN=0)
+    OFF = 0,                              // Radio explicitly powered off (eg CFUN=0)
     UNAVAILABLE = 1,                      // Radio unavailable (eg, resetting or not booted)
     ON = 10,                              // Radio is ON
 };
@@ -242,17 +242,17 @@
     CONNECT_FAILURE,
     MSG_SIZE_TOO_LARGE,
     MSG_SIZE_TOO_SMALL,
-    CONNECT_OK_CALL_ONGOING
+    CONNECT_OK_CALL_ONGOING,
 };
 
 enum SapDisconnectType : int32_t {
     GRACEFUL,
-    IMMEDIATE
+    IMMEDIATE,
 };
 
 enum SapApduType : int32_t {
     APDU,
-    APDU7816
+    APDU7816,
 };
 
 enum SapResultCode : int32_t {
@@ -263,7 +263,7 @@
     CARD_REMOVED,
     CARD_ALREADY_POWERED_ON,
     DATA_NOT_AVAILABLE,
-    NOT_SUPPORTED
+    NOT_SUPPORTED,
 };
 
 enum SapStatus : int32_t {
@@ -272,21 +272,21 @@
     CARD_NOT_ACCESSIBLE,
     CARD_REMOVED,
     CARD_INSERTED,
-    RECOVERED
+    RECOVERED,
 };
 
 enum SapTransferProtocol : int32_t {
     T0,
-    T1
+    T1,
 };
 
 enum CallState : int32_t {
     ACTIVE,
     HOLDING,
-    DIALING,                             // MO call only
-    ALERTING,                            // MO call only
-    INCOMING,                            // MT call only
-    WAITING,                             // MT call only
+    DIALING,                              // MO call only
+    ALERTING,                             // MO call only
+    INCOMING,                             // MT call only
+    WAITING,                              // MT call only
 };
 
 /*
@@ -311,7 +311,7 @@
     USP,                                  // User specified protocol
     OSIHLP,                               // OSI higher layer protocol
     X244,                                 // X.244
-    RMCF,                                 // Reserved for system mangement convergence function
+    RMCF,                                 // Reserved for system management convergence function
     IA5C,                                 // IA5 characters
 };
 
@@ -323,9 +323,9 @@
 };
 
 enum Clir : int32_t {
-    DEFAULT,                               // "use subscription default value"
-    INVOCATION,                            // restrict CLI presentation
-    SUPPRESSION,                           // allow CLI presentation
+    DEFAULT,                              // "use subscription default value"
+    INVOCATION,                           // restrict CLI presentation
+    SUPPRESSION,                          // allow CLI presentation
 };
 
 enum LastCallFailCause : int32_t {
@@ -519,7 +519,7 @@
                                           // emergency calls are enabled.
     REG_DENIED_EM,                        // Same as REG_DENIED but indicates that
                                           // emergency calls are enabled.
-    UNKNOWN_EM                            // Same as UNKNOWN but indicates that
+    UNKNOWN_EM,                           // Same as UNKNOWN but indicates that
                                           // emergency calls are enabled.
 };
 
@@ -539,8 +539,8 @@
     EVDO_B = 12,
     EHRPD = 13,
     LTE = 14,
-    HSPAP = 15,                            // HSPA+
-    GSM = 16,                              // Only supports voice
+    HSPAP = 15,                           // HSPA+
+    GSM = 16,                             // Only supports voice
     TD_SCDMA = 17,
     IWLAN = 18,
     LTE_CA = 19,
@@ -557,7 +557,7 @@
 };
 
 enum SmsAcknowledgeFailCause : int32_t {
-    MEMORY_CAPAPCITY_EXCEEDED = 0xD3,
+    MEMORY_CAPACITY_EXCEEDED = 0xD3,
     UNSPECIFIED_ERROR = 0XFF,
 };
 
@@ -572,7 +572,7 @@
 enum ClipStatus : int32_t {
     CLIP_PROVISIONED,                     // CLIP provisioned
     CLIP_UNPROVISIONED,                   // CLIP not provisioned
-    UNKOWN,                               // unknown, e.g. no network etc
+    UNKNOWN,                              // unknown, e.g. no network etc
 };
 
 enum SmsWriteArgsStatus : int32_t {
@@ -659,63 +659,63 @@
 
 enum NvItem : int32_t {
     // CDMA radio and account information (items 1-10)
-    CDMA_MEID = 1,                       // CDMA MEID (hex)
-    CDMA_MIN = 2,                        // CDMA MIN (MSID)
-    CDMA_MDN = 3,                        // CDMA MDN
-    CDMA_ACCOLC = 4,                     // CDMA access overload control
+    CDMA_MEID = 1,                        // CDMA MEID (hex)
+    CDMA_MIN = 2,                         // CDMA MIN (MSID)
+    CDMA_MDN = 3,                         // CDMA MDN
+    CDMA_ACCOLC = 4,                      // CDMA access overload control
 
     // Carrier device provisioning (items 11-30)
-    DEVICE_MSL = 11,                     // device MSL
-    RTN_RECONDITIONED_STATUS = 12,       // RTN reconditioned status
-    RTN_ACTIVATION_DATE = 13,            // RTN activation date
-    RTN_LIFE_TIMER = 14,                 // RTN life timer
-    RTN_LIFE_CALLS = 15,                 // RTN life calls
-    RTN_LIFE_DATA_TX = 16,               // RTN life data TX
-    RTN_LIFE_DATA_RX = 17,               // RTN life data RX
-    OMADM_HFA_LEVEL = 18,                // HFA in progress
+    DEVICE_MSL = 11,                      // device MSL
+    RTN_RECONDITIONED_STATUS = 12,        // RTN reconditioned status
+    RTN_ACTIVATION_DATE = 13,             // RTN activation date
+    RTN_LIFE_TIMER = 14,                  // RTN life timer
+    RTN_LIFE_CALLS = 15,                  // RTN life calls
+    RTN_LIFE_DATA_TX = 16,                // RTN life data TX
+    RTN_LIFE_DATA_RX = 17,                // RTN life data RX
+    OMADM_HFA_LEVEL = 18,                 // HFA in progress
 
     // Mobile IP profile information (items 31-50)
-    MIP_PROFILE_NAI = 31,                // NAI realm
-    MIP_PROFILE_HOME_ADDRESS = 32,       // MIP home address
-    MIP_PROFILE_AAA_AUTH = 33,           // AAA auth
-    MIP_PROFILE_HA_AUTH = 34,            // HA auth
-    MIP_PROFILE_PRI_HA_ADDR = 35,        // primary HA address
-    MIP_PROFILE_SEC_HA_ADDR = 36,        // secondary HA address
-    MIP_PROFILE_REV_TUN_PREF = 37,       // reverse TUN preference
-    MIP_PROFILE_HA_SPI = 38,             // HA SPI
-    MIP_PROFILE_AAA_SPI = 39,            // AAA SPI
-    MIP_PROFILE_MN_HA_SS = 40,           // HA shared secret
-    MIP_PROFILE_MN_AAA_SS = 41,          // AAA shared secret
+    MIP_PROFILE_NAI = 31,                 // NAI realm
+    MIP_PROFILE_HOME_ADDRESS = 32,        // MIP home address
+    MIP_PROFILE_AAA_AUTH = 33,            // AAA auth
+    MIP_PROFILE_HA_AUTH = 34,             // HA auth
+    MIP_PROFILE_PRI_HA_ADDR = 35,         // primary HA address
+    MIP_PROFILE_SEC_HA_ADDR = 36,         // secondary HA address
+    MIP_PROFILE_REV_TUN_PREF = 37,        // reverse TUN preference
+    MIP_PROFILE_HA_SPI = 38,              // HA SPI
+    MIP_PROFILE_AAA_SPI = 39,             // AAA SPI
+    MIP_PROFILE_MN_HA_SS = 40,            // HA shared secret
+    MIP_PROFILE_MN_AAA_SS = 41,           // AAA shared secret
 
     // CDMA network and band config (items 51-70)
-    CDMA_PRL_VERSION = 51,               // CDMA PRL version
-    CDMA_BC10 = 52,                      // CDMA band class 10
-    CDMA_BC14 = 53,                      // CDMA band class 14
-    CDMA_SO68 = 54,                      // CDMA SO68
-    CDMA_SO73_COP0 = 55,                 // CDMA SO73 COP0
-    CDMA_SO73_COP1TO7 = 56,              // CDMA SO73 COP1-7
-    CDMA_1X_ADVANCED_ENABLED = 57,       // CDMA 1X Advanced enabled
-    CDMA_EHRPD_ENABLED = 58,             // CDMA eHRPD enabled
-    CDMA_EHRPD_FORCED = 59,              // CDMA eHRPD forced
+    CDMA_PRL_VERSION = 51,                // CDMA PRL version
+    CDMA_BC10 = 52,                       // CDMA band class 10
+    CDMA_BC14 = 53,                       // CDMA band class 14
+    CDMA_SO68 = 54,                       // CDMA SO68
+    CDMA_SO73_COP0 = 55,                  // CDMA SO73 COP0
+    CDMA_SO73_COP1TO7 = 56,               // CDMA SO73 COP1-7
+    CDMA_1X_ADVANCED_ENABLED = 57,        // CDMA 1X Advanced enabled
+    CDMA_EHRPD_ENABLED = 58,              // CDMA eHRPD enabled
+    CDMA_EHRPD_FORCED = 59,               // CDMA eHRPD forced
 
     // LTE network and band config (items 71-90)
-    LTE_BAND_ENABLE_25 = 71,             // LTE band 25 enable
-    LTE_BAND_ENABLE_26 = 72,             // LTE band 26 enable
-    LTE_BAND_ENABLE_41 = 73,             // LTE band 41 enable
+    LTE_BAND_ENABLE_25 = 71,              // LTE band 25 enable
+    LTE_BAND_ENABLE_26 = 72,              // LTE band 26 enable
+    LTE_BAND_ENABLE_41 = 73,              // LTE band 41 enable
 
-    LTE_SCAN_PRIORITY_25 = 74,           // LTE band 25 scan priority
-    LTE_SCAN_PRIORITY_26 = 75,           // LTE band 26 scan priority
-    LTE_SCAN_PRIORITY_41 = 76,           // LTE band 41 scan priority
+    LTE_SCAN_PRIORITY_25 = 74,            // LTE band 25 scan priority
+    LTE_SCAN_PRIORITY_26 = 75,            // LTE band 26 scan priority
+    LTE_SCAN_PRIORITY_41 = 76,            // LTE band 41 scan priority
 
-    LTE_HIDDEN_BAND_PRIORITY_25 = 77,    // LTE hidden band 25 priority
-    LTE_HIDDEN_BAND_PRIORITY_26 = 78,    // LTE hidden band 26 priority
-    LTE_HIDDEN_BAND_PRIORITY_41 = 79,    // LTE hidden band 41 priority
+    LTE_HIDDEN_BAND_PRIORITY_25 = 77,     // LTE hidden band 25 priority
+    LTE_HIDDEN_BAND_PRIORITY_26 = 78,     // LTE hidden band 26 priority
+    LTE_HIDDEN_BAND_PRIORITY_41 = 79,     // LTE hidden band 41 priority
 };
 
 enum ResetNvType : int32_t {
-    RELOAD,                              // reload all NV items
-    ERASE,                               // erase NV reset (SCRTN)
-    FACORY_RESET,                        // factory reset (RTN)
+    RELOAD,                               // reload all NV items
+    ERASE,                                // erase NV reset (SCRTN)
+    FACTORY_RESET,                        // factory reset (RTN)
 };
 
 enum HardwareConfigType : int32_t {
@@ -736,11 +736,11 @@
 };
 
 enum CarrierMatchType : int32_t {
-    ALL = 0,                               // Apply to all carriers with the same mcc/mnc
-    SPN = 1,                               // Use SPN and mcc/mnc to identify the carrier
-    IMSI_PREFIX = 2,                       // Use IMSI prefix and mcc/mnc to identify the carrier
-    GID1 = 3,                              // Use GID1 and mcc/mnc to identify the carrier
-    GID2 = 4,                              // Use GID2 and mcc/mnc to identify the carrier
+    ALL = 0,                              // Apply to all carriers with the same mcc/mnc
+    SPN = 1,                              // Use SPN and mcc/mnc to identify the carrier
+    IMSI_PREFIX = 2,                      // Use IMSI prefix and mcc/mnc to identify the carrier
+    GID1 = 3,                             // Use GID1 and mcc/mnc to identify the carrier
+    GID2 = 4,                             // Use GID2 and mcc/mnc to identify the carrier
 };
 
 struct NeighboringCell {
@@ -804,8 +804,8 @@
 };
 
 enum CdmaSmsSubaddressType : int32_t {
-    NSAP,                                // CCITT X.213 or ISO 8348 AD2
-    USER_SPECIFIED,                      // e.g. X.25
+    NSAP,                                 // CCITT X.213 or ISO 8348 AD2
+    USER_SPECIFIED,                       // e.g. X.25
 };
 
 enum CdmaSmsErrorClass : int32_t {
@@ -849,30 +849,30 @@
 };
 
 enum RadioCapabilityPhase : int32_t {
-    CONFIGURED = 0,                      // Logical Modem's (LM)  initial value
-                                         // and value after FINISH completes
-    START      = 1,                      // START is sent before APPLY and indicates that an
-                                         // APPLY is forthcoming with these same parameters
-    APPLY      = 2,                      // APPLY is sent after all LM's receive START and returned
-                                         // RadioCapability.status = 0. If any START's fail, hal
-                                         // implementation must not send APPLY.
-    UNSOL_RSP  = 3,                      // UNSOL_RSP is sent with unsol radioCapability()
-    FINISH     = 4                       // FINISH is sent after all commands have completed. If an
-                                         // error occurs in any previous command, the
-                                         // RadioAccessesFamily and logicalModemUuid fields must be
-                                         // the prior configuration thus restoring the configuration
-                                         // to the previous value. An error returned by FINISH
-                                         // will generally be ignored or may cause that logical
-                                         // modem to be removed from service.
+    CONFIGURED = 0,                       // Logical Modem's (LM)  initial value
+                                          // and value after FINISH completes
+    START      = 1,                       // START is sent before APPLY and indicates that an
+                                          // APPLY is forthcoming with these same parameters
+    APPLY      = 2,                       // APPLY is sent after all LM's receive START and returned
+                                          // RadioCapability.status = 0. If any START's fail, hal
+                                          // implementation must not send APPLY.
+    UNSOL_RSP  = 3,                       // UNSOL_RSP is sent with unsolicited radioCapability()
+    FINISH     = 4                        // FINISH is sent after all commands have completed. If an
+                                          // error occurs in any previous command, the
+                                          // RadioAccessesFamily and logicalModemUuid fields must be
+                                          // the prior configuration thus restoring the
+                                          // configuration to the previous value. An error returned
+                                          // by FINISH will generally be ignored or may cause that
+                                          // logical modem to be removed from service.
 };
 
 enum RadioCapabilityStatus : int32_t {
-    NONE       = 0,                      // This parameter has no meaning with
-                                         // RadioCapabilityPhase:START, RadioCapabilityPhase:APPLY
-    SUCCESS    = 1,                      // Tell modem the action transaction of set radio
-                                         // capability was success with RadioCapabilityPhase:FINISH
-    FAIL       = 2,                      // Tell modem the action transaction of set radio
-                                         // capability is fail with RadioCapabilityPhase:FINISH.
+    NONE       = 0,                       // This parameter has no meaning with
+                                          // RadioCapabilityPhase:START, RadioCapabilityPhase:APPLY
+    SUCCESS    = 1,                       // Tell modem the action transaction of set radio
+                                          // capability was success with RadioCapabilityPhase:FINISH
+    FAIL       = 2,                       // Tell modem the action transaction of set radio
+                                          // capability is fail with RadioCapabilityPhase:FINISH.
 };
 
 enum RadioAccessFamily : int32_t {
@@ -898,19 +898,19 @@
 };
 
 enum UssdModeType : int32_t {
-    NOTIFY,                                // USSD-Notify
-    REQUEST,                               // USSD-Request
-    NW_RELEASE,                            // Session terminated by network
-    LOCAL_CLIENT,                          // other local client (eg, SIM Toolkit) has responded
-    NOT_SUPPORTED,                         // Operation not supported
-    NW_TIMEOUT,                            // Network timeout
+    NOTIFY,                               // USSD-Notify
+    REQUEST,                              // USSD-Request
+    NW_RELEASE,                           // Session terminated by network
+    LOCAL_CLIENT,                         // other local client (eg, SIM Toolkit) has responded
+    NOT_SUPPORTED,                        // Operation not supported
+    NW_TIMEOUT,                           // Network timeout
 };
 
 enum SimRefreshType : int32_t {
-    SIM_FILE_UPDATE = 0,                   // A file on SIM has been updated.
-    SIM_INIT = 1,                          // SIM initialized. All files should be re-read.
-    SIM_RESET = 2                          // SIM reset. SIM power required, SIM may be locked a
-                                           // nd all files must be re-read.
+    SIM_FILE_UPDATE = 0,                  // A file on SIM has been updated.
+    SIM_INIT = 1,                         // SIM initialized. All files should be re-read.
+    SIM_RESET = 2                         // SIM reset. SIM power required, SIM may be locked a
+                                          // nd all files must be re-read.
 };
 
 enum SrvccState :int32_t {
@@ -938,15 +938,15 @@
 };
 
 enum PhoneRestrictedState : int32_t {
-    NONE = 0x00,                           // No restriction at all including voice/SMS/USSD/SS/AV64
-                                           // and packet data
-    CS_EMERGENCY = 0x01,                   // Block emergency call due to restriction. But allow all
-                                           // normal voice/SMS/USSD/SS/AV64.
-    CS_NORMAL = 0x02,                      // Block all normal voice/SMS/USSD/SS/AV64 due to
-                                           // restriction. Only Emergency call allowed.
-    CS_ALL = 0x04,                         // Block all voice/SMS/USSD/SS/AV64 including emergency
-                                           // call due to restriction.
-    PS_ALL = 0x10                          // Block packet data access due to restriction.
+    NONE = 0x00,                          // No restriction at all including voice/SMS/USSD/SS/AV64
+                                          // and packet data
+    CS_EMERGENCY = 0x01,                  // Block emergency call due to restriction. But allow all
+                                          // normal voice/SMS/USSD/SS/AV64.
+    CS_NORMAL = 0x02,                     // Block all normal voice/SMS/USSD/SS/AV64 due to
+                                          // restriction. Only Emergency call allowed.
+    CS_ALL = 0x04,                        // Block all voice/SMS/USSD/SS/AV64 including emergency
+                                          // call due to restriction.
+    PS_ALL = 0x10                         // Block packet data access due to restriction.
 };
 
 enum CdmaCallWaitingNumberPresentation : int32_t {
@@ -1199,7 +1199,7 @@
 };
 
 struct TdScdmaSignalStrength {
-    uint32_t rscp;                        // The Received Signal Code Power in dBm multipled by -1.
+    uint32_t rscp;                        // The Received Signal Code Power in dBm multiplied by -1.
                                           // Range : 25 to 120
                                           // INT_MAX: 0x7FFFFFFF denotes invalid value.
                                           // Reference: 3GPP TS 25.123, section 9.1.1.1
@@ -1228,7 +1228,7 @@
     int32_t suggestedRetryTime;           // If status != 0, this fields indicates the suggested
                                           // retry back-off timer value RIL wants to override the
                                           // one pre-configured in FW.
-                                          // The unit is miliseconds.
+                                          // The unit is milliseconds.
                                           // The value < 0 means no value is suggested.
                                           // The value 0 means retry must be done ASAP.
                                           // The value of INT_MAX(0x7fffffff) means no retry.
@@ -1266,7 +1266,7 @@
     int32_t command;                      // one of the commands listed for TS 27.007 +CRSM
     int32_t fileId;                       // EF id
     string path;                          // "pathid" from TS 27.007 +CRSM command.
-                                          // Path is in hex asciii format eg "7f205f70"
+                                          // Path is in hex ascii format eg "7f205f70"
                                           // Path must always be provided.
     int32_t p1;                           // Values of p1, p2 and p3 defined as per 3GPP TS 51.011
     int32_t p2;
@@ -1385,7 +1385,7 @@
     int32_t reasonDataDenied;             // if registration state is 3 (Registration
                                           // denied) this is an enumerated reason why
                                           // registration was denied. See 3GPP TS 24.008,
-                                          // Annex G.6 "Additonal cause codes for GMM".
+                                          // Annex G.6 "Additional cause codes for GMM".
                                           // 7 == GPRS services not allowed
                                           // 8 == GPRS services and non-GPRS services not allowed
                                           // 9 == MS identity cannot be derived by the network
@@ -1415,7 +1415,7 @@
     int32_t serviceClass;                 // From 27.007 +CCFC/+CLCK "class"
                                           // See table for Android mapping from
                                           // MMI service code
-                                          // 0 means user doesnt input class
+                                          // 0 means user doesn't input class
     int32_t toa;                          // "type" from TS 27.007 7.11
     string number;                        // "number" from TS 27.007 7.11.
     int32_t timeSeconds;
@@ -1439,27 +1439,27 @@
 };
 
 struct CdmaSmsAddress {
-    CdmaSmsDigitMode digitMode;          // CdmaSmsDigitMode is of two types : 4 bit and 8 bit.
-                                         // For 4-bit type, only "digits" field defined below in
-                                         // this struct is used.
-    CdmaSmsNumberMode numberMode;        // Used only when digitMode is 8-bit
-    CdmaSmsNumberType numberType;        // Used only when digitMode is 8-bit.
-                                         // To specify an international address, use the following:
-                                         // digitMode = CdmaSmsDigitMode:EIGHT_BIT:
-                                         // numberMode = CdmaSmsNumberMode:NOT_DATA_NETWORK
-                                         // numberType = CdmaSmsNumberType:INTERNATIONAL_OR_DATA_IP
-                                         // numberPlan = CdmaSmsNumberPlan:TELEPHONY
-                                         // numberOfDigits = number of digits
-                                         // digits = ASCII digits, e.g. '1', '2', '3', '4', and '5'
-    CdmaSmsNumberPlan numberPlan;        // Used only when digitMode is 8-bit
-    vec<uint8_t> digits;                 // Each byte in this array represents a 4 bit or 8-bit digit
-                                         // of address data
+    CdmaSmsDigitMode digitMode;           // CdmaSmsDigitMode is of two types : 4 bit and 8 bit.
+                                          // For 4-bit type, only "digits" field defined below in
+                                          // this struct is used.
+    CdmaSmsNumberMode numberMode;         // Used only when digitMode is 8-bit
+    CdmaSmsNumberType numberType;         // Used only when digitMode is 8-bit.
+                                          // To specify an international address, use the following:
+                                          // digitMode = CdmaSmsDigitMode:EIGHT_BIT:
+                                          // numberMode = CdmaSmsNumberMode:NOT_DATA_NETWORK
+                                          // numberType = CdmaSmsNumberType:INTERNATIONAL_OR_DATA_IP
+                                          // numberPlan = CdmaSmsNumberPlan:TELEPHONY
+                                          // numberOfDigits = number of digits
+                                          // digits = ASCII digits, e.g. '1', '2', '3', '4', and '5'
+    CdmaSmsNumberPlan numberPlan;         // Used only when digitMode is 8-bit
+    vec<uint8_t> digits;                  // Each byte in this array represents a 4 bit or 8-bit
+                                          // digit of address data
 };
 
 struct CdmaSmsSubaddress {
     CdmaSmsSubaddressType subaddressType;
-    bool odd;                            // true means the last byte's lower 4 bits must be ignored
-    vec<uint8_t> digits;                 // Each byte respresents an 8-bit digit of subaddress data
+    bool odd;                             // true means the last byte's lower 4 bits must be ignored
+    vec<uint8_t> digits;                  // Each byte represents an 8-bit digit of subaddress data
 };
 
 struct CdmaSmsMessage {
@@ -1468,29 +1468,29 @@
     int32_t serviceCategory;
     CdmaSmsAddress address;
     CdmaSmsSubaddress subAddress;
-    vec<uint8_t> bearerData;             // 3GPP2 C.S0015-B, v2.0,
+    vec<uint8_t> bearerData;              // 3GPP2 C.S0015-B, v2.0,
 };
 
 struct CdmaSmsAck {
     CdmaSmsErrorClass errorClass;
-    int32_t smsCauseCode;                // As defined in N.S00005, 6.5.2.125.
-                                         // Currently, only 35 (resource shortage) and
-                                         // 39 (other terminal problem) are reported.
+    int32_t smsCauseCode;                 // As defined in N.S00005, 6.5.2.125.
+                                          // Currently, only 35 (resource shortage) and
+                                          // 39 (other terminal problem) are reported.
 };
 
 struct CdmaBroadcastSmsConfigInfo {
-    int32_t serviceCategory;             // serviceCategory defines a Broadcast message identifier
-                                         // whose value is 0x0000 - 0xFFFF as defined in
-                                         // C.R1001G 9.3.1 and 9.3.2.
-    int32_t language;                    // language code of Broadcast Message
-                                         // whose value is 0x00 - 0x07 as defined in C.R1001G 9.2.
-    bool selected;                       // selected false means message types specified in
-                                         // serviceCategory are not accepted, while true means
-                                         // accepted.
+    int32_t serviceCategory;              // serviceCategory defines a Broadcast message identifier
+                                          // whose value is 0x0000 - 0xFFFF as defined in
+                                          // C.R1001G 9.3.1 and 9.3.2.
+    int32_t language;                     // language code of Broadcast Message
+                                          // whose value is 0x00 - 0x07 as defined in C.R1001G 9.2.
+    bool selected;                        // selected false means message types specified in
+                                          // serviceCategory are not accepted, while true means
+                                          // accepted.
 };
 
 struct CdmaSmsWriteArgs {
-    CdmaSmsWriteArgsStatus status;       // Status of message. See TS 27.005 3.1
+    CdmaSmsWriteArgsStatus status;        // Status of message. See TS 27.005 3.1
     CdmaSmsMessage message;
 };
 
@@ -1520,68 +1520,68 @@
 };
 
 struct CellIdentityGsm {
-    string mcc;                          // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
-    string mnc;                          // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if
-                                         // unknown
-    int32_t lac;                         // 16-bit Location Area Code, 0..65535, INT_MAX if unknown
-    int32_t cid;                         // 16-bit GSM Cell Identity described in
-                                         // TS 27.007, 0..65535, INT_MAX if unknown
-    int32_t arfcn;                       // 16-bit GSM Absolute RF channel number, INT_MAX if
-                                         // unknown
-    uint8_t bsic;                        // 6-bit Base Station Identity Code, 0xFF if unknown
+    string mcc;                           // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
+    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if
+                                          // unknown
+    int32_t lac;                          // 16-bit Location Area Code, 0..65535, INT_MAX if unknown
+    int32_t cid;                          // 16-bit GSM Cell Identity described in
+                                          // TS 27.007, 0..65535, INT_MAX if unknown
+    int32_t arfcn;                        // 16-bit GSM Absolute RF channel number, INT_MAX if
+                                          // unknown
+    uint8_t bsic;                         // 6-bit Base Station Identity Code, 0xFF if unknown
 };
 
 struct CellIdentityWcdma {
-    string mcc;                          // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
-    string mnc;                          // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX
-                                         // if unknown
-    int32_t lac;                         // 16-bit Location Area Code, 0..65535, INT_MAX if unknown
-    int32_t cid;                         // 28-bit UMTS Cell Identity described in
-                                         // TS 25.331, 0..268435455, INT_MAX if unknown
-    int32_t psc;                         // 9-bit UMTS Primary Scrambling Code described in
-                                         // TS 25.331, 0..511, INT_MAX if unknown
-    int32_t uarfcn;                      // 16-bit UMTS Absolute RF Channel Number, INT_MAX if
-                                         // unknown
+    string mcc;                           // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
+    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX
+                                          // if unknown
+    int32_t lac;                          // 16-bit Location Area Code, 0..65535, INT_MAX if unknown
+    int32_t cid;                          // 28-bit UMTS Cell Identity described in
+                                          // TS 25.331, 0..268435455, INT_MAX if unknown
+    int32_t psc;                          // 9-bit UMTS Primary Scrambling Code described in
+                                          // TS 25.331, 0..511, INT_MAX if unknown
+    int32_t uarfcn;                       // 16-bit UMTS Absolute RF Channel Number, INT_MAX if
+                                          // unknown
 };
 
 struct CellIdentityCdma {
-    int32_t networkId;                   // Network Id 0..65535, INT_MAX if unknown
-    int32_t systemId;                    // CDMA System Id 0..32767, INT_MAX if unknown
-    int32_t basestationId;               // Base Station Id 0..65535, INT_MAX if unknown
-    int32_t longitude;                   // Longitude is a decimal number as specified in
-                                         // 3GPP2 C.S0005-A v6.0. It is represented in units of
-                                         // 0.25 seconds and ranges from -2592000 to 2592000,
-                                         // both values inclusive (corresponding to a range of -180
-                                         // to +180 degrees). INT_MAX if unknown
-    int32_t latitude;                    // Latitude is a decimal number as specified in
-                                         // 3GPP2 C.S0005-A v6.0. It is represented in units of
-                                         // 0.25 seconds and ranges from -1296000 to 1296000,
-                                         // both values inclusive (corresponding to a range of -90
-                                         // to +90 degrees). INT_MAX if unknown
+    int32_t networkId;                    // Network Id 0..65535, INT_MAX if unknown
+    int32_t systemId;                     // CDMA System Id 0..32767, INT_MAX if unknown
+    int32_t baseStationId;                // Base Station Id 0..65535, INT_MAX if unknown
+    int32_t longitude;                    // Longitude is a decimal number as specified in
+                                          // 3GPP2 C.S0005-A v6.0. It is represented in units of
+                                          // 0.25 seconds and ranges from -2592000 to 2592000,
+                                          // both values inclusive (corresponding to a range of -180
+                                          // to +180 degrees). INT_MAX if unknown
+    int32_t latitude;                     // Latitude is a decimal number as specified in
+                                          // 3GPP2 C.S0005-A v6.0. It is represented in units of
+                                          // 0.25 seconds and ranges from -1296000 to 1296000,
+                                          // both values inclusive (corresponding to a range of -90
+                                          // to +90 degrees). INT_MAX if unknown
 };
 
 struct CellIdentityLte {
-    string mcc;                          // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
-    string mnc;                          // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if
-                                         // unknown
-    int32_t ci;                          // 28-bit Cell Identity described in TS TS 27.007, INT_MAX
-                                         // if unknown
-    int32_t pci;                         // physical cell id 0..503, INT_MAX if unknown
-    int32_t tac;                         // 16-bit tracking area code, INT_MAX if unknown
-    int32_t earfcn;                      // 18-bit LTE Absolute RC Channel Number, INT_MAX if
-                                         // unknown
+    string mcc;                           // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
+    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if
+                                          // unknown
+    int32_t ci;                           // 28-bit Cell Identity described in TS TS 27.007, INT_MAX
+                                          // if unknown
+    int32_t pci;                          // physical cell id 0..503, INT_MAX if unknown
+    int32_t tac;                          // 16-bit tracking area code, INT_MAX if unknown
+    int32_t earfcn;                       // 18-bit LTE Absolute RC Channel Number, INT_MAX if
+                                          // unknown
 };
 
 struct CellIdentityTdscdma {
-    string mcc;                          // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
-    string mnc;                          // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if
-                                         // unknown
-    int32_t lac;                         // 16-bit Location Area Code, 0..65535, INT_MAX if
-                                         // unknown
-    int32_t cid;                         // 28-bit UMTS Cell Identity described in
-                                         // TS 25.331, 0..268435455, INT_MAX if unknown
-    int32_t cpid;                        // 8-bit Cell Parameters ID described in
-                                         // TS 25.331, 0..127, INT_MAX if unknown
+    string mcc;                           // 3-digit Mobile Country Code, 0..999, INT_MAX if unknown
+    string mnc;                           // 2 or 3-digit Mobile Network Code, 0..999, INT_MAX if
+                                          // unknown
+    int32_t lac;                          // 16-bit Location Area Code, 0..65535, INT_MAX if
+                                          // unknown
+    int32_t cid;                          // 28-bit UMTS Cell Identity described in
+                                          // TS 25.331, 0..268435455, INT_MAX if unknown
+    int32_t cpid;                         // 8-bit Cell Parameters ID described in
+                                          // TS 25.331, 0..127, INT_MAX if unknown
 };
 
 struct CellInfoGsm {
@@ -1611,56 +1611,57 @@
 };
 
 struct CellInfo {
-    CellInfoType cellInfoType;           // cell type for selecting from union CellInfo
-    bool registered;                     // true if this cell is registered false if not registered
-    TimeStampType timeStampType;         // type of time stamp represented by timeStamp
-    uint64_t timeStamp;                  // Time in nanos as returned by ril_nano_time
+    CellInfoType cellInfoType;            // cell type for selecting from union CellInfo
+    bool registered;                      // true if this cell is registered false if not registered
+    TimeStampType timeStampType;          // type of time stamp represented by timeStamp
+    uint64_t timeStamp;                   // Time in nanos as returned by ril_nano_time
     // Only one of the below vectors must be of size 1 based on the CellInfoType and others must be
     // of size 0
-    vec<CellInfoGsm> gsm;                // Valid only if type = gsm and size = 1 else must be empty
-    vec<CellInfoCdma> cdma;              // Valid only if type = cdma and size = 1 else must be
-                                         // empty
-    vec<CellInfoLte> lte;                // Valid only if type = lte and size = 1 else must be
-                                         // empty
-    vec<CellInfoWcdma> wcdma;            // Valid only if type = wcdma and size = 1 else must be
-                                         // empty
-    vec<CellInfoTdscdma> tdscdma;        // Valid only if type = tdscdma and size = 1 else must be
-                                         // empty
+    vec<CellInfoGsm> gsm;                 // Valid only if type = gsm and size = 1 else must be
+                                          // empty
+    vec<CellInfoCdma> cdma;               // Valid only if type = cdma and size = 1 else must be
+                                          // empty
+    vec<CellInfoLte> lte;                 // Valid only if type = lte and size = 1 else must be
+                                          // empty
+    vec<CellInfoWcdma> wcdma;             // Valid only if type = wcdma and size = 1 else must be
+                                          // empty
+    vec<CellInfoTdscdma> tdscdma;         // Valid only if type = tdscdma and size = 1 else must be
+                                          // empty
 };
 
 struct GsmSmsMessage {
-    string smscPdu;                      // SMSC address in GSM BCD format prefixed by a length
-                                         // byte (as expected by TS 27.005) or empty string for
-                                         // default SMSC
-    string pdu;                          // SMS in PDU format as an ASCII hex string less the
-                                         // SMSC address. TP-Layer-Length is be "strlen(pdu)/2
+    string smscPdu;                       // SMSC address in GSM BCD format prefixed by a length
+                                          // byte (as expected by TS 27.005) or empty string for
+                                          // default SMSC
+    string pdu;                           // SMS in PDU format as an ASCII hex string less the
+                                          // SMSC address. TP-Layer-Length is be "strlen(pdu)/2
 };
 
 struct ImsSmsMessage {
     RadioTechnologyFamily tech;
-    bool retry;                          // false == not retry, true == retry */
-    int32_t messageRef;                  // Valid field if retry is set to true.
-                                         // Contains messageRef from SendSmsResult stuct
-                                         // corresponding to failed MO SMS.
+    bool retry;                           // false == not retry, true == retry */
+    int32_t messageRef;                   // Valid field if retry is set to true.
+                                          // Contains messageRef from SendSmsResult struct
+                                          // corresponding to failed MO SMS.
     // Only one of the below vectors must be of size 1 based on the RadioTechnologyFamily and others
     // must be of size 0
-    vec<CdmaSmsMessage> cdmaMessage;     // Valid field if tech is 3GPP2 and size = 1 else must be
-                                         // empty
-    vec<GsmSmsMessage> gsmMessage;       // Valid field if tech is 3GPP and size = 1 else must be
-                                         // empty
+    vec<CdmaSmsMessage> cdmaMessage;      // Valid field if tech is 3GPP2 and size = 1 else must be
+                                          // empty
+    vec<GsmSmsMessage> gsmMessage;        // Valid field if tech is 3GPP and size = 1 else must be
+                                          // empty
 };
 
 struct SimApdu {
-    int32_t sessionId;                   // "sessionid" from TS 27.007 +CGLA command. Must be
-                                         // ignored for +CSIM command.
+    int32_t sessionId;                    // "sessionid" from TS 27.007 +CGLA command. Must be
+                                          // ignored for +CSIM command.
     // Following fields are used to derive the APDU ("command" and "length"
     // values in TS 27.007 +CSIM and +CGLA commands).
     int32_t cla;
     int32_t instruction;
     int32_t p1;
     int32_t p2;
-    int32_t p3;                          // A negative P3 implies a 4 byte APDU.
-    string data;                         // In hex string format ([a-fA-F0-9]*).
+    int32_t p3;                           // A negative P3 implies a 4 byte APDU.
+    string data;                          // In hex string format ([a-fA-F0-9]*).
 };
 
 struct NvWriteItem {
@@ -1670,160 +1671,159 @@
 
 struct SelectUiccSub {
     int32_t slot;
-    int32_t appIndex;                   // array subscriptor from
-                                        // applications[RadioConst:CARD_MAX_APPS] in
-                                        // getIccCardStatus()
+    int32_t appIndex;                     // array subscriptor from
+                                          // applications[RadioConst:CARD_MAX_APPS] in
+                                          // getIccCardStatus()
     SubscriptionType subType;
     UiccSubActStatus actStatus;
 };
 
 struct HardwareConfigModem {
     int32_t rilModel;
-    uint32_t rat;                       // bitset - ref. RadioTechnology.
+    uint32_t rat;                         // bitset - ref. RadioTechnology.
     int32_t maxVoice;
     int32_t maxData;
     int32_t maxStandby;
 };
 
 struct HardwareConfigSim {
-    string modemUuid;                   // RadioConst:MAX_UUID_LENGTH is max length of the
-                                        // string
+    string modemUuid;                     // RadioConst:MAX_UUID_LENGTH is max length of the string
 };
 
 struct HardwareConfig {
     HardwareConfigType type;
-    string uuid;                         // RadioConst:MAX_UUID_LENGTH is max length of the
-                                         // string
+    string uuid;                          // RadioConst:MAX_UUID_LENGTH is max length of the string
     HardwareConfigState state;
+
     // Only one of the below vectors must have size = 1 based on the HardwareConfigType and other
     // must have size = 0.
-    vec<HardwareConfigModem> modem;      // Valid only if type is Modem and size = 1 else must be
-                                         // empty
-    vec<HardwareConfigSim> sim;          // Valid only if type is SIM or else emptyand size = 1
-                                         // else must be empty
+    vec<HardwareConfigModem> modem;       // Valid only if type is Modem and size = 1 else must be
+                                          // empty
+    vec<HardwareConfigSim> sim;           // Valid only if type is SIM or else empty and size = 1
+                                          // else must be empty
 };
 
 struct DataProfileInfo {
-    int32_t profileId;                   // id of the data profile
-    string apn;                          // The APN to connect to
-    string protocol;                     // One of the PDP_type values in TS 27.007 section 10.1.1.
-                                         // For example, "IP", "IPV6", "IPV4V6", or "PPP".
+    int32_t profileId;                    // id of the data profile
+    string apn;                           // The APN to connect to
+    string protocol;                      // One of the PDP_type values in TS 27.007 section 10.1.1.
+                                          // For example, "IP", "IPV6", "IPV4V6", or "PPP".
     ApnAuthType authType;
-    string user;                         // The username for APN, or empty string
-    string password;                     // The password for APN, or empty string
+    string user;                          // The username for APN, or empty string
+    string password;                      // The password for APN, or empty string
     DataProfileInfoType type;
-    int32_t maxConnsTime;                // The period in seconds to limit the maximum connections
-    int32_t maxConns;                    // The maximum connections during maxConnsTime
-    int32_t waitTime;                    // The required wait time in seconds after a successful UE
-                                         // initiated disconnect of a given PDN connection before
-                                         // the device can send a new PDN connection request for
-                                         // that given PDN
-    bool enabled;                        // True to enable the profile, false to disable
+    int32_t maxConnsTime;                 // The period in seconds to limit the maximum connections
+    int32_t maxConns;                     // The maximum connections during maxConnsTime
+    int32_t waitTime;                     // The required wait time in seconds after a successful UE
+                                          // initiated disconnect of a given PDN connection before
+                                          // the device can send a new PDN connection request for
+                                          // that given PDN
+    bool enabled;                         // True to enable the profile, false to disable
 };
 
 struct RadioCapability {
-    int32_t session;                     // Unique session value defined by framework returned in
-                                         // all "responses/unsol"
+    int32_t session;                      // Unique session value defined by framework returned in
+                                          // all "responses/unsol"
     RadioCapabilityPhase phase;
-    RadioAccessFamily raf;
-    string logicalModemUuid;             // A UUID typically "com.xxxx.lmX where X is the logical
-                                         // modem. RadioConst:MAX_UUID_LENGTH is the max
-                                         // length
+    bitfield<RadioAccessFamily> raf;      // 32-bit bitmap of RadioAccessFamily
+    string logicalModemUuid;              // A UUID typically "com.xxxx.lmX where X is the logical
+                                          // modem. RadioConst:MAX_UUID_LENGTH is the max
+                                          // length
     RadioCapabilityStatus status;
 };
 
 struct LceStatusInfo {
     LceStatus lceStatus;
-    uint8_t actualIntervalMs;            // actual LCE reporting interval,
-                                         // meaningful only if LceStatus = ACTIVE.
+    uint8_t actualIntervalMs;             // actual LCE reporting interval,
+                                          // meaningful only if LceStatus = ACTIVE.
 };
 
 struct LceDataInfo {
-    uint32_t lastHopCapacityKbps;          // last-hop cellular capacity: kilobits/second.
-    uint8_t confidenceLevel;               // capacity estimate confidence: 0-100
-    bool lceSuspended;                     // LCE report going to be suspended? (e.g., radio
-                                           // moves to inactive state or network type change)
-                                           // true = suspended;
-                                           // false = not suspended.
+    uint32_t lastHopCapacityKbps;         // last-hop cellular capacity: kilobits/second.
+    uint8_t confidenceLevel;              // capacity estimate confidence: 0-100
+    bool lceSuspended;                    // LCE report going to be suspended? (e.g., radio
+                                          // moves to inactive state or network type change)
+                                          // true = suspended;
+                                          // false = not suspended.
 };
 
 struct ActivityStatsInfo {
-    uint32_t sleepModeTimeMs;              // total time (in ms) when modem is in a low power or
-                                           // sleep state
-    uint32_t idleModeTimeMs;               // total time (in ms) when modem is awake but neither
-                                           // the transmitter nor receiver are active/awake
+    uint32_t sleepModeTimeMs;             // total time (in ms) when modem is in a low power or
+                                          // sleep state
+    uint32_t idleModeTimeMs;              // total time (in ms) when modem is awake but neither
+                                          // the transmitter nor receiver are active/awake
     uint32_t[RadioConst:NUM_TX_POWER_LEVELS] txmModetimeMs;
-                                           // Each index represent total time (in ms) during which
-                                           // the transmitter is active/awake for a particular
-                                           // power range as shown below.
-                                           // index 0 = tx_power < 0dBm
-                                           // index 1 = 0dBm < tx_power < 5dBm
-                                           // index 2 = 5dBm < tx_power < 15dBm
-                                           // index 3 = 15dBm < tx_power < 20dBm
-                                           // index 4 = tx_power > 20dBm
-    uint32_t rxModeTimeMs;                 // total time (in ms) for which receiver is
-                                           // active/awake and the transmitter is inactive
+                                          // Each index represent total time (in ms) during which
+                                          // the transmitter is active/awake for a particular
+                                          // power range as shown below.
+                                          // index 0 = tx_power < 0dBm
+                                          // index 1 = 0dBm < tx_power < 5dBm
+                                          // index 2 = 5dBm < tx_power < 15dBm
+                                          // index 3 = 15dBm < tx_power < 20dBm
+                                          // index 4 = tx_power > 20dBm
+    uint32_t rxModeTimeMs;                // total time (in ms) for which receiver is
+                                          // active/awake and the transmitter is inactive
 };
 
 struct Carrier {
     string mcc;
     string mnc;
-    CarrierMatchType matchType;            // Specify match type for the carrier.
-                                           // If it’s ALL, matchData is empty string;
-                                           // otherwise, matchData is the value for the match type.
+    CarrierMatchType matchType;           // Specify match type for the carrier.
+                                          // If it’s ALL, matchData is empty string;
+                                          // otherwise, matchData is the value for the match type.
     string matchData;
 };
 
 struct CarrierRestrictions {
-    vec<Carrier> allowedCarriers;          // whitelist for allowed carriers
-    vec<Carrier> excludedCarriers;         // blacklist for explicitly excluded carriers
-                                           // which match allowed_carriers. Eg. allowedCarriers
-                                           // match mcc/mnc, excludedCarriers has same mcc/mnc and
-                                           // gid1 is ABCD. It means except the carrier whose gid1
-                                           // is ABCD, all carriers with the same mcc/mnc are
-                                           // allowed.
+    vec<Carrier> allowedCarriers;         // whitelist for allowed carriers
+    vec<Carrier> excludedCarriers;        // blacklist for explicitly excluded carriers
+                                          // which match allowed_carriers. Eg. allowedCarriers
+                                          // match mcc/mnc, excludedCarriers has same mcc/mnc and
+                                          // gid1 is ABCD. It means except the carrier whose gid1
+                                          // is ABCD, all carriers with the same mcc/mnc are
+                                          // allowed.
 };
 
 struct SuppSvcNotification {
-    bool isMT;                             // notification type
-                                           // false = MO intermediate result code
-                                           // true = MT unsolicited result code
-    int32_t code;                          // result code. See 27.007 7.17.
-    int32_t index;                         // CUG index. See 27.007 7.17.
-    int32_t type;                          // "type" from 27.007 7.17 (MT only).
-    string number;                         // "number" from 27.007 7.17
-                                           // (MT only, may be empty string).
+    bool isMT;                            // notification type
+                                          // false = MO intermediate result code
+                                          // true = MT unsolicited result code
+    int32_t code;                         // result code. See 27.007 7.17.
+    int32_t index;                        // CUG index. See 27.007 7.17.
+    int32_t type;                         // "type" from 27.007 7.17 (MT only).
+    string number;                        // "number" from 27.007 7.17
+                                          // (MT only, may be empty string).
 };
 
 struct SimRefreshResult {
     SimRefreshType type;
-    int32_t efId;                          // is the EFID of the updated file if the result is
-                                           // SIM_FILE_UPDATE or 0 for any other result.
-    string aid;                            // is AID(application ID) of the card application
-                                           // See ETSI 102.221 8.1 and 101.220 4
-                                           // For SIM_FILE_UPDATE result it must be set to AID of
-                                           // application in which updated EF resides or it must be
-                                           // empty string if EF is outside of an application.
-                                           // For SIM_INIT result this field is set to AID of
-                                           // application that caused REFRESH
-                                           // For SIM_RESET result it is empty string.
+    int32_t efId;                         // is the EFID of the updated file if the result is
+                                          // SIM_FILE_UPDATE or 0 for any other result.
+    string aid;                           // is AID(application ID) of the card application
+                                          // See ETSI 102.221 8.1 and 101.220 4
+                                          // For SIM_FILE_UPDATE result it must be set to AID of
+                                          // application in which updated EF resides or it must be
+                                          // empty string if EF is outside of an application.
+                                          // For SIM_INIT result this field is set to AID of
+                                          // application that caused REFRESH
+                                          // For SIM_RESET result it is empty string.
 };
 
 /* CDMA Signal Information Record as defined in C.S0005 section 3.7.5.5 */
 struct CdmaSignalInfoRecord {
-    bool isPresent;                        // true if signal information record is present
-    int8_t signalType;                     // as defined 3.7.5.5-1
-    int8_t alertPitch;                     // as defined 3.7.5.5-2
-    int8_t signal;                         // as defined 3.7.5.5-3, 3.7.5.5-4 or 3.7.5.5-5
+    bool isPresent;                       // true if signal information record is present
+    int8_t signalType;                    // as defined 3.7.5.5-1
+    int8_t alertPitch;                    // as defined 3.7.5.5-2
+    int8_t signal;                        // as defined 3.7.5.5-3, 3.7.5.5-4 or 3.7.5.5-5
 };
 
 struct CdmaCallWaiting {
-    string number;                         // Remote party number
+    string number;                        // Remote party number
     CdmaCallWaitingNumberPresentation numberPresentation;
-    string name;                           // Remote party name
+    string name;                          // Remote party name
     CdmaSignalInfoRecord signalInfoRecord;
     // Number type/Number plan required to support International Call Waiting
-    CdmaCallWaitingNumberType numbertype;
+    CdmaCallWaitingNumberType numberType;
     CdmaCallWaitingNumberPlan numberPlan;
 };
 
@@ -1837,7 +1837,7 @@
  * The display_tag, display_len and chari fields are all 1 byte.
  */
 struct CdmaDisplayInfoRecord {
-    string alphaBuf;                       // Max length = RadioConst:CDMA_ALPHA_INFO_BUFFER_LENGTH
+    string alphaBuf;                      // Max length = RadioConst:CDMA_ALPHA_INFO_BUFFER_LENGTH
 };
 
 /*
@@ -1846,7 +1846,7 @@
  * Connected Number Info Rec as defined in C.S0005 section 3.7.5.4
  */
 struct CdmaNumberInfoRecord {
-    string number;                         // Max length = RADIP_CDMA_NUMBER_INFO_BUFFER_LENGTH
+    string number;                        // Max length = RADIP_CDMA_NUMBER_INFO_BUFFER_LENGTH
     uint8_t numberType;
     uint8_t numberPlan;
     uint8_t pi;
@@ -1881,56 +1881,56 @@
     CdmaInfoRecName name;
     // Only one of the below vectors must have size = 1 based on the
     // CdmaInfoRecName. All other vectors must have size 0.
-    vec<CdmaDisplayInfoRecord> display;  // Display and Extended Display Info Rec
-    vec<CdmaNumberInfoRecord> number;    // Called Party Number, Calling Party Number, Connected
-                                         // number Info Rec
-    vec<CdmaSignalInfoRecord> signal;    // Signal Info Rec
+    vec<CdmaDisplayInfoRecord> display;   // Display and Extended Display Info Rec
+    vec<CdmaNumberInfoRecord> number;     // Called Party Number, Calling Party Number, Connected
+                                          // number Info Rec
+    vec<CdmaSignalInfoRecord> signal;     // Signal Info Rec
     vec<CdmaRedirectingNumberInfoRecord> redir; // Redirecting Number Info Rec
     vec<CdmaLineControlInfoRecord> lineCtrl;    // Line Control Info Rec
-    vec<CdmaT53ClirInfoRecord> clir;     // T53 CLIR Info Rec
+    vec<CdmaT53ClirInfoRecord> clir;      // T53 CLIR Info Rec
     vec<CdmaT53AudioControlInfoRecord> audioCtrl; // T53 Audio Control Info Rec
 };
 
 struct CdmaInformationRecords {
-    vec<CdmaInformationRecord> infoRec;  // Max length = RadioConst:CDMA_MAX_NUMBER_OF_INFO_RECS
+    vec<CdmaInformationRecord> infoRec;   // Max length = RadioConst:CDMA_MAX_NUMBER_OF_INFO_RECS
 };
 
 struct CfData {
-    vec<CallForwardInfo> cfInfo;         // This is the response data
-                                         // for SS request to query call
-                                         // forward status. see getCallForwardStatus()
-                                         // Max size = RadioConst:NUM_SERVICE_CLASSES
+    vec<CallForwardInfo> cfInfo;          // This is the response data
+                                          // for SS request to query call
+                                          // forward status. see getCallForwardStatus()
+                                          // Max size = RadioConst:NUM_SERVICE_CLASSES
 };
 
 struct SsInfoData {
-    vec<int32_t> ssInfo;                 // This is the response data for all of the SS GET/SET
-                                         // Radio requests. E.g. IRadio.getClir() returns
-                                         // two ints, so first two values of ssInfo[] will be
-                                         // used for response if serviceType is SS_CLIR and
-                                         // requestType is SS_INTERROGATION
-                                         // Max size = RadioConst:SS_INFO_MAX
+    vec<int32_t> ssInfo;                  // This is the response data for all of the SS GET/SET
+                                          // Radio requests. E.g. IRadio.getClir() returns
+                                          // two ints, so first two values of ssInfo[] will be
+                                          // used for response if serviceType is SS_CLIR and
+                                          // requestType is SS_INTERROGATION
+                                          // Max size = RadioConst:SS_INFO_MAX
 };
 
 struct StkCcUnsolSsResult {
     SsServiceType serviceType;
     SsRequestType requestType;
     SsTeleserviceType teleserviceType;
-    SuppServiceClass serviceClass;
+    bitfield<SuppServiceClass> serviceClass;
     RadioError result;
     // Only one of the below vectors may contain values and other must be empty
-    vec<SsInfoData> ssInfo;              // Valid only for all SsserviceType except
-                                         // SsServiceType:CF_* else empty.
-    vec<CfData> cfData;                  // Valid for SsServiceType:CF_* else empty
+    vec<SsInfoData> ssInfo;               // Valid only for all SsServiceType except
+                                          // SsServiceType:CF_* else empty.
+    vec<CfData> cfData;                   // Valid for SsServiceType:CF_* else empty
 };
 
 struct PcoDataInfo {
-    int32_t cid;                         // Context ID, uniquely identifies this call
-    string bearerProto;                  // One of the PDP_type values in TS 27.007 section 10.1.1.
-                                         // For example, "IP", "IPV6", "IPV4V6"
-    int32_t pcoId;                       // The protocol ID for this box. Note that only IDs from
-                                         // FF00H - FFFFH are accepted. If more than one is
-                                         // included from the network, multiple calls must be made
-                                         // to send all of them.
-    vec<uint8_t> contents;               // Carrier-defined content. It is binary, opaque and
-                                         // loosely defined in LTE Layer 3 spec 24.008
+    int32_t cid;                          // Context ID, uniquely identifies this call
+    string bearerProto;                   // One of the PDP_type values in TS 27.007 section 10.1.1.
+                                          // For example, "IP", "IPV6", "IPV4V6"
+    int32_t pcoId;                        // The protocol ID for this box. Note that only IDs from
+                                          // FF00H - FFFFH are accepted. If more than one is
+                                          // included from the network, multiple calls must be made
+                                          // to send all of them.
+    vec<uint8_t> contents;                // Carrier-defined content. It is binary, opaque and
+                                          // loosely defined in LTE Layer 3 spec 24.008
 };
diff --git a/sensors/1.0/default/service.cpp b/sensors/1.0/default/service.cpp
index 230ead3..5bcfe4b 100644
--- a/sensors/1.0/default/service.cpp
+++ b/sensors/1.0/default/service.cpp
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#define LOG_TAG "android.hardware.nfc@1.0-service"
+#define LOG_TAG "android.hardware.sensors@1.0-service"
 
 #include <android/hardware/sensors/1.0/ISensors.h>
 #include <hidl/LegacySupport.h>
@@ -23,5 +23,5 @@
 using android::hardware::defaultPassthroughServiceImplementation;
 
 int main() {
-    return defaultPassthroughServiceImplementation<ISensors>("sensors");
+    return defaultPassthroughServiceImplementation<ISensors>();
 }
diff --git a/sensors/1.0/vts/functional/sensors_hidl_hal_test.cpp b/sensors/1.0/vts/functional/sensors_hidl_hal_test.cpp
index c7600f3..9a71745 100644
--- a/sensors/1.0/vts/functional/sensors_hidl_hal_test.cpp
+++ b/sensors/1.0/vts/functional/sensors_hidl_hal_test.cpp
@@ -41,8 +41,6 @@
 using ::android::sp;
 using namespace ::android::hardware::sensors::V1_0;
 
-#define SENSORS_SERVICE_NAME "sensors"
-
 // Test environment for sensors
 class SensorsHidlEnvironment : public ::testing::Environment {
  public:
@@ -82,7 +80,7 @@
 };
 
 void SensorsHidlEnvironment::SetUp() {
-  sensors = ISensors::getService(SENSORS_SERVICE_NAME, false);
+  sensors = ISensors::getService();
   ALOGI_IF(sensors, "sensors is not nullptr, %p", sensors.get());
   ASSERT_NE(sensors, nullptr);
 
diff --git a/sensors/1.0/vts/functional/vts/testcases/hal/sensors/hidl/host/SensorsHidlTest.py b/sensors/1.0/vts/functional/vts/testcases/hal/sensors/hidl/host/SensorsHidlTest.py
index db210d9..3c7fbbb 100644
--- a/sensors/1.0/vts/functional/vts/testcases/hal/sensors/hidl/host/SensorsHidlTest.py
+++ b/sensors/1.0/vts/functional/vts/testcases/hal/sensors/hidl/host/SensorsHidlTest.py
@@ -84,7 +84,7 @@
         logging.info("PERMISSION_DENIED: %s", sensors_types.PERMISSION_DENIED)
         logging.info("INVALID_OPERATION: %s", sensors_types.INVALID_OPERATION)
         asserts.assertEqual(sensors_types.OK, 0);
-        asserts.assertEqual(sensors_types.BAD_VALUE, 1);
+        asserts.assertEqual(sensors_types.BAD_VALUE, -22);
 
         logging.info("sensor types:")
         logging.info("SENSOR_TYPE_ACCELEROMETER: %s", sensors_types.SENSOR_TYPE_ACCELEROMETER)
diff --git a/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml
index ca8ecdb..9339165 100644
--- a/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml
+++ b/soundtrigger/2.0/vts/functional/vts/testcases/hal/soundtrigger/hidl/target/AndroidTest.xml
@@ -25,7 +25,8 @@
             _64bit::DATA/nativetest64/soundtrigger_hidl_hal_test/soundtrigger_hidl_hal_test,
             "/>
         <option name="test-config-path" value="vts/testcases/hal/soundtrigger/hidl/target/HalSoundTriggerHidlTargetBasicTest.config" />
-        <option name="binary-test-type" value="gtest" />
+        <option name="binary-test-type" value="hal_hidl_gtest" />
+        <option name="precondition-file-path-prefix" value="*/lib/hw/sound_trigger.primary." />
         <option name="test-timeout" value="1m" />
     </test>
 </configuration>
diff --git a/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/Android.mk b/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/Android.mk
new file mode 100644
index 0000000..40536a5
--- /dev/null
+++ b/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := TvCecHidlProfilingTest
+VTS_CONFIG_SRC_DIR := testcases/hal/tv_cec/hidl/host_profiling
+include test/vts/tools/build/Android.host_config.mk
diff --git a/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/AndroidTest.xml b/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/AndroidTest.xml
new file mode 100644
index 0000000..ffd857e
--- /dev/null
+++ b/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/AndroidTest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Config for VTS Tv Input HIDL HAL's host-side test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+        <option name="push" value="spec/hardware/interfaces/tv/cec/1.0/vts/HdmiCec.vts->/data/local/tmp/spec/HdmiCec.vts" />
+        <option name="push" value="spec/hardware/interfaces/tv/cec/1.0/vts/HdmiCecCallback.vts->/data/local/tmp/spec/HdmiCecCallback.vts" />
+        <option name="push" value="spec/hardware/interfaces/tv/cec/1.0/vts/types.vts->/data/local/tmp/spec/types.vts" />
+        <option name="cleanup" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="TvCecHidlProfilingTest" />
+        <option name="test-case-path" value="vts/testcases/hal/tv_cec/hidl/host/TvCecHidlTest" />
+        <option name="enable-profiling" value="true" />
+    </test>
+</configuration>
\ No newline at end of file
diff --git a/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/__init__.py b/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tv/cec/1.0/vts/functional/vts/testcases/hal/tv_cec/hidl/host_profiling/__init__.py
diff --git a/tv/input/1.0/default/TvInput.cpp b/tv/input/1.0/default/TvInput.cpp
index 6181ffb..4cd1d40 100644
--- a/tv/input/1.0/default/TvInput.cpp
+++ b/tv/input/1.0/default/TvInput.cpp
@@ -196,7 +196,7 @@
     return type != TV_STREAM_TYPE_BUFFER_PRODUCER;
 }
 
-ITvInput* HIDL_FETCH_ITvInput(const char* name) {
+ITvInput* HIDL_FETCH_ITvInput(const char* /* name */) {
     int ret = 0;
     const hw_module_t* hw_module = nullptr;
     tv_input_device_t* input_device;
@@ -213,7 +213,8 @@
         }
     }
     else {
-        LOG(ERROR) << "hw_get_module " << name << " failed: " << ret;
+        LOG(ERROR) << "hw_get_module " << TV_INPUT_HARDWARE_MODULE_ID
+                   << " failed: " << ret;
         return nullptr;
     }
 }
diff --git a/tv/input/1.0/default/service.cpp b/tv/input/1.0/default/service.cpp
index d59c848..d904d0b 100644
--- a/tv/input/1.0/default/service.cpp
+++ b/tv/input/1.0/default/service.cpp
@@ -27,5 +27,5 @@
 using android::hardware::defaultPassthroughServiceImplementation;
 
 int main() {
-    return defaultPassthroughServiceImplementation<ITvInput>("tv.input");
+    return defaultPassthroughServiceImplementation<ITvInput>();
 }
diff --git a/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host/TvInputHidlTest.py b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host/TvInputHidlTest.py
index 9b49078..b5becd6 100644
--- a/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host/TvInputHidlTest.py
+++ b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host/TvInputHidlTest.py
@@ -39,7 +39,6 @@
                                  target_version=1.0,
                                  target_package="android.hardware.tv.input",
                                  target_component_name="ITvInput",
-                                 hw_binder_service_name="tv-input-1-0",
                                  bits=64 if self.dut.is64Bit else 32)
 
         self.dut.shell.InvokeTerminal("one")
diff --git a/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/Android.mk b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/Android.mk
new file mode 100644
index 0000000..514df20
--- /dev/null
+++ b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := TvInputHidlProfilingTest
+VTS_CONFIG_SRC_DIR := testcases/hal/tv_input/hidl/host_profiling
+include test/vts/tools/build/Android.host_config.mk
diff --git a/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/AndroidTest.xml b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/AndroidTest.xml
new file mode 100644
index 0000000..5b8e6f9
--- /dev/null
+++ b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/AndroidTest.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<configuration description="Config for VTS Tv Input HIDL HAL's host-side test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+        <option name="push" value="spec/hardware/interfaces/tv/input/1.0/vts/TvInput.vts->/data/local/tmp/spec/TvInput.vts" />
+        <option name="push" value="spec/hardware/interfaces/tv/input/1.0/vts/TvInputCallback.vts->/data/local/tmp/spec/TvInputCallback.vts" />
+        <option name="push" value="spec/hardware/interfaces/tv/input/1.0/vts/types.vts->/data/local/tmp/spec/types.vts" />
+        <option name="cleanup" value="true" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer">
+    </target_preparer>
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="TvInputHidlProfilingTest" />
+        <option name="test-case-path" value="vts/testcases/hal/tv_input/hidl/host/TvInputHidlTest" />
+        <option name="enable-profiling" value="true" />
+    </test>
+</configuration>
diff --git a/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/__init__.py b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tv/input/1.0/vts/functional/vts/testcases/hal/tv_input/hidl/host_profiling/__init__.py
diff --git a/update-base-files.sh b/update-base-files.sh
index e2331f5..1eb6b51 100755
--- a/update-base-files.sh
+++ b/update-base-files.sh
@@ -25,6 +25,9 @@
 hidl-gen $options \
          -o hardware/libhardware/include/hardware/nfc-base.h \
          android.hardware.nfc@1.0
+hidl-gen $options \
+         -o hardware/libhardware/include/hardware/gnss-base.h \
+         android.hardware.gnss@1.0
 
 # system/core
 hidl-gen $options \
diff --git a/usb/1.0/Android.bp b/usb/1.0/Android.bp
new file mode 100644
index 0000000..8b84a4a
--- /dev/null
+++ b/usb/1.0/Android.bp
@@ -0,0 +1,64 @@
+// This file is autogenerated by hidl-gen. Do not edit manually.
+
+genrule {
+    name: "android.hardware.usb@1.0_genc++",
+    tools: ["hidl-gen"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.usb@1.0",
+    srcs: [
+        "types.hal",
+        "IUsb.hal",
+        "IUsbCallback.hal",
+    ],
+    out: [
+        "android/hardware/usb/1.0/types.cpp",
+        "android/hardware/usb/1.0/UsbAll.cpp",
+        "android/hardware/usb/1.0/UsbCallbackAll.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.usb@1.0_genc++_headers",
+    tools: ["hidl-gen"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.usb@1.0",
+    srcs: [
+        "types.hal",
+        "IUsb.hal",
+        "IUsbCallback.hal",
+    ],
+    out: [
+        "android/hardware/usb/1.0/types.h",
+        "android/hardware/usb/1.0/IUsb.h",
+        "android/hardware/usb/1.0/IHwUsb.h",
+        "android/hardware/usb/1.0/BnHwUsb.h",
+        "android/hardware/usb/1.0/BpHwUsb.h",
+        "android/hardware/usb/1.0/BsUsb.h",
+        "android/hardware/usb/1.0/IUsbCallback.h",
+        "android/hardware/usb/1.0/IHwUsbCallback.h",
+        "android/hardware/usb/1.0/BnHwUsbCallback.h",
+        "android/hardware/usb/1.0/BpHwUsbCallback.h",
+        "android/hardware/usb/1.0/BsUsbCallback.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.usb@1.0",
+    generated_sources: ["android.hardware.usb@1.0_genc++"],
+    generated_headers: ["android.hardware.usb@1.0_genc++_headers"],
+    export_generated_headers: ["android.hardware.usb@1.0_genc++_headers"],
+    shared_libs: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "libcutils",
+        "android.hidl.base@1.0",
+    ],
+    export_shared_lib_headers: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hidl.base@1.0",
+    ],
+}
diff --git a/usb/1.0/Android.mk b/usb/1.0/Android.mk
new file mode 100644
index 0000000..0eded5b
--- /dev/null
+++ b/usb/1.0/Android.mk
@@ -0,0 +1,427 @@
+# This file is autogenerated by hidl-gen. Do not edit manually.
+
+LOCAL_PATH := $(call my-dir)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.usb@1.0-java
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+intermediates := $(local-generated-sources-dir)
+
+HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
+
+LOCAL_JAVA_LIBRARIES := \
+    android.hidl.base@1.0-java \
+
+
+#
+# Build types.hal (PortDataRole)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortDataRole.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortDataRole
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortMode)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortMode.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortMode
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortPowerRole)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortPowerRole.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortPowerRole
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortRole)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortRole.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortRole
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortRoleType)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortRoleType.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortRoleType
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortStatus)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortStatus.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortStatus
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (Status)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/Status.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.Status
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build IUsb.hal
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/IUsb.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IUsbCallback.hal
+$(GEN): $(LOCAL_PATH)/IUsbCallback.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::IUsb
+
+$(GEN): $(LOCAL_PATH)/IUsb.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build IUsbCallback.hal
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/IUsbCallback.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::IUsbCallback
+
+$(GEN): $(LOCAL_PATH)/IUsbCallback.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+include $(BUILD_JAVA_LIBRARY)
+
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.usb@1.0-java-static
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+intermediates := $(local-generated-sources-dir)
+
+HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
+
+LOCAL_STATIC_JAVA_LIBRARIES := \
+    android.hidl.base@1.0-java-static \
+
+
+#
+# Build types.hal (PortDataRole)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortDataRole.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortDataRole
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortMode)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortMode.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortMode
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortPowerRole)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortPowerRole.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortPowerRole
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortRole)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortRole.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortRole
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortRoleType)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortRoleType.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortRoleType
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (PortStatus)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/PortStatus.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.PortStatus
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build types.hal (Status)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/Status.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::types.Status
+
+$(GEN): $(LOCAL_PATH)/types.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build IUsb.hal
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/IUsb.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsb.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/IUsbCallback.hal
+$(GEN): $(LOCAL_PATH)/IUsbCallback.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::IUsb
+
+$(GEN): $(LOCAL_PATH)/IUsb.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
+# Build IUsbCallback.hal
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/IUsbCallback.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IUsbCallback.hal
+$(GEN): PRIVATE_DEPS += $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0::IUsbCallback
+
+$(GEN): $(LOCAL_PATH)/IUsbCallback.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.usb@1.0-java-constants
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+intermediates := $(local-generated-sources-dir)
+
+HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
+#
+GEN := $(intermediates)/android/hardware/usb/V1_0/Constants.java
+$(GEN): $(HIDL)
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/IUsb.hal
+$(GEN): $(LOCAL_PATH)/IUsbCallback.hal
+
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_OUTPUT_DIR := $(intermediates)
+$(GEN): PRIVATE_CUSTOM_TOOL = \
+        $(PRIVATE_HIDL) -o $(PRIVATE_OUTPUT_DIR) \
+        -Ljava-constants \
+        -randroid.hardware:hardware/interfaces \
+        -randroid.hidl:system/libhidl/transport \
+        android.hardware.usb@1.0
+
+$(GEN):
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+# Avoid dependency cycle of framework.jar -> this-library -> framework.jar
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVA_LIBRARIES := core-oj
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
+
+
+
+include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/usb/1.0/IUsb.hal b/usb/1.0/IUsb.hal
new file mode 100644
index 0000000..965326a
--- /dev/null
+++ b/usb/1.0/IUsb.hal
@@ -0,0 +1,57 @@
+/*
+ * 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 android.hardware.usb@1.0;
+
+import IUsbCallback;
+
+interface IUsb {
+    /*
+     * This function is used to change the port role of a specific port.
+     * For example, when PD_SWAP or PR_SWAP is supported.
+     * This is function is asynchronous. The status of the role switch
+     * will be informed through IUsbCallback object's notifyPortStatusChange
+     * method.
+     *
+     * @param portName name of the port for which the role has to be changed
+     * @param role the new port role.
+     */
+    oneway switchRole(string portName, PortRole role);
+
+    /*
+     * This function is used to register a callback function which is
+     * called by the HAL whenever there is a change in the port state.
+     * i.e. DATA_ROLE, POWER_ROLE or MODE.
+     *
+     * Also the same callback object would be called to inform the caller
+     * of the roleSwitch status.
+     *
+     * @param callback IUsbCallback object used to convey status to the
+     * userspace.
+     */
+    oneway setCallback(IUsbCallback callback);
+
+    /*
+     * This functions is used to request the hal for the current status
+     * status of the Type-C ports. This method is async/oneway. The result of the
+     * query would be sent through the IUsbCallback object's notifyRoleSwitchStatus
+     * to the caller. This api would would let the caller know of the number
+     * of type-c ports that are present and their connection status through the
+     * PortStatus type.
+     */
+    oneway queryPortStatus();
+};
+
diff --git a/usb/1.0/IUsbCallback.hal b/usb/1.0/IUsbCallback.hal
new file mode 100644
index 0000000..b665ba3
--- /dev/null
+++ b/usb/1.0/IUsbCallback.hal
@@ -0,0 +1,45 @@
+/*
+ * 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 android.hardware.usb@1.0;
+
+/*
+ * Callback object used for all the IUsb async methods which expects a result.
+ * Caller is expected to register the callback object using setCallback method
+ * to receive updates on the PortStatus.
+ */
+interface IUsbCallback {
+    /*
+     * Used to convey the current port status to the caller.
+     * Called either when PortState changes due to the port partner (or)
+     * when caller requested for the PortStatus update through queryPortStatus.
+     *
+     * @param currentPortStatus vector object of current status of all the
+     * typeC ports in the device.
+     * @param retval SUCCESS when query was done successfully.
+     * ERROR otherwise.
+     */
+    oneway notifyPortStatusChange(vec<PortStatus> currentPortStatus, Status retval);
+
+    /*
+     * Used to notify the result of the switchRole call to the caller.
+     *
+     * @param portName name of the port for which the roleswap is requested.
+     * @param newRole the new role requested by the caller.
+     * @param retval SUCCESS if the role switch succeeded. FAILURE otherwise.
+     */
+    oneway notifyRoleSwitchStatus(string portName, PortRole newRole, Status retval);
+};
diff --git a/usb/1.0/default/Android.mk b/usb/1.0/default/Android.mk
new file mode 100644
index 0000000..09d7ce7
--- /dev/null
+++ b/usb/1.0/default/Android.mk
@@ -0,0 +1,21 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE_RELATIVE_PATH := hw
+LOCAL_MODULE := android.hardware.usb@1.0-service
+LOCAL_INIT_RC := android.hardware.usb@1.0-service.rc
+LOCAL_SRC_FILES := \
+    service.cpp \
+    Usb.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+    libcutils \
+    libhidlbase \
+    libhidltransport \
+    liblog \
+    libhwbinder \
+    libutils \
+    libhardware \
+    android.hardware.usb@1.0 \
+
+include $(BUILD_EXECUTABLE)
diff --git a/usb/1.0/default/Usb.cpp b/usb/1.0/default/Usb.cpp
new file mode 100644
index 0000000..f46ff66
--- /dev/null
+++ b/usb/1.0/default/Usb.cpp
@@ -0,0 +1,428 @@
+/*
+ * 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.
+ */
+#include <dirent.h>
+#include <iostream>
+#include <fstream>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include <cutils/uevent.h>
+#include <sys/epoll.h>
+#include <utils/Errors.h>
+#include <utils/StrongPointer.h>
+
+#include "Usb.h"
+
+namespace android {
+namespace hardware {
+namespace usb {
+namespace V1_0 {
+namespace implementation {
+
+int32_t readFile(std::string filename, std::string& contents) {
+    std::ifstream file(filename);
+
+    if (file.is_open()) {
+        getline(file, contents);
+        file.close();
+        return 0;
+    }
+    return -1;
+}
+
+std::string appendRoleNodeHelper(const std::string portName, PortRoleType type) {
+    std::string node("/sys/class/dual_role_usb/" + portName);
+
+    switch(type) {
+        case PortRoleType::DATA_ROLE:
+            return node + "/data_role";
+        case PortRoleType::POWER_ROLE:
+            return node + "/power_role";
+        default:
+            return node + "/mode";
+    }
+}
+
+std::string convertRoletoString(PortRole role) {
+    if (role.type == PortRoleType::POWER_ROLE) {
+        if (role.role == static_cast<uint32_t> (PortPowerRole::SOURCE))
+            return "source";
+        else if (role.role ==  static_cast<uint32_t> (PortPowerRole::SINK))
+            return "sink";
+    } else if (role.type == PortRoleType::DATA_ROLE) {
+        if (role.role == static_cast<uint32_t> (PortDataRole::HOST))
+            return "host";
+        if (role.role == static_cast<uint32_t> (PortDataRole::DEVICE))
+            return "device";
+    } else if (role.type == PortRoleType::MODE) {
+        if (role.role == static_cast<uint32_t> (PortMode::UFP))
+            return "ufp";
+        if (role.role == static_cast<uint32_t> (PortMode::DFP))
+            return "dfp";
+    }
+    return "none";
+}
+
+Return<void> Usb::switchRole(const hidl_string& portName,
+        const PortRole& newRole) {
+    std::string filename = appendRoleNodeHelper(std::string(portName.c_str()),
+        newRole.type);
+    std::ofstream file(filename);
+    std::string written;
+
+    ALOGI("filename write: %s role:%d", filename.c_str(), newRole.role);
+
+    if (file.is_open()) {
+        file << convertRoletoString(newRole).c_str();
+        file.close();
+        if (!readFile(filename, written)) {
+            ALOGI("written: %s", written.c_str());
+            if (written == convertRoletoString(newRole)) {
+                ALOGI("Role switch successfull");
+                Return<void> ret =
+                    mCallback->notifyRoleSwitchStatus(portName, newRole,
+                    Status::SUCCESS);
+                if (!ret.isOk())
+                    ALOGE("RoleSwitchStatus error %s",
+                        ret.description().c_str());
+            }
+        }
+    }
+
+    Return<void> ret = mCallback->notifyRoleSwitchStatus(portName, newRole, Status::ERROR);
+    if (!ret.isOk())
+        ALOGE("RoleSwitchStatus error %s", ret.description().c_str());
+
+    return Void();
+}
+
+Status getCurrentRoleHelper(std::string portName,
+        PortRoleType type, uint32_t &currentRole)  {
+    std::string filename;
+    std::string roleName;
+
+    if (type == PortRoleType::POWER_ROLE) {
+        filename = "/sys/class/dual_role_usb/" +
+            portName + "/power_role";
+        currentRole = static_cast<uint32_t>(PortPowerRole::NONE);
+    } else if (type == PortRoleType::DATA_ROLE) {
+        filename = "/sys/class/dual_role_usb/" +
+            portName + "/data_role";
+        currentRole = static_cast<uint32_t> (PortDataRole::NONE);
+    } else if (type == PortRoleType::MODE) {
+        filename = "/sys/class/dual_role_usb/" +
+            portName + "/mode";
+        currentRole = static_cast<uint32_t> (PortMode::NONE);
+    }
+
+    if (readFile(filename, roleName)) {
+        ALOGE("getCurrentRole: Failed to open filesystem node");
+        return Status::ERROR;
+    }
+
+    if (roleName == "dfp")
+        currentRole = static_cast<uint32_t> (PortMode::DFP);
+    else if (roleName == "ufp")
+        currentRole = static_cast<uint32_t> (PortMode::UFP);
+    else if (roleName == "source")
+        currentRole = static_cast<uint32_t> (PortPowerRole::SOURCE);
+    else if (roleName == "sink")
+        currentRole = static_cast<uint32_t> (PortPowerRole::SINK);
+    else if (roleName == "host")
+        currentRole = static_cast<uint32_t> (PortDataRole::HOST);
+    else if (roleName == "device")
+        currentRole = static_cast<uint32_t> (PortDataRole::DEVICE);
+    else if (roleName != "none") {
+         /* case for none has already been addressed.
+          * so we check if the role isnt none.
+          */
+        return Status::UNRECOGNIZED_ROLE;
+    }
+    return Status::SUCCESS;
+}
+
+Status getTypeCPortNamesHelper(std::vector<std::string>& names) {
+    DIR *dp;
+
+    dp = opendir("/sys/class/dual_role_usb");
+    if (dp != NULL)
+    {
+rescan:
+        int32_t ports = 0;
+        int32_t current = 0;
+        struct dirent *ep;
+
+        while ((ep = readdir (dp))) {
+            if (ep->d_type == DT_LNK) {
+                ports++;
+            }
+        }
+        names.resize(ports);
+        rewinddir(dp);
+
+        while ((ep = readdir (dp))) {
+            /* Check to see if new ports were added since the first pass. */
+            if (current >= ports) {
+               rewinddir(dp);
+               goto rescan;
+            }
+
+            if (ep->d_type == DT_LNK) {
+                names[current++] = ep->d_name;
+            }
+        }
+
+        closedir (dp);
+        return Status::SUCCESS;
+    }
+
+    ALOGE("Failed to open /sys/class/dual_role_usb");
+    return Status::ERROR;
+}
+
+bool canSwitchRoleHelper(const std::string portName, PortRoleType type)  {
+    std::string filename = appendRoleNodeHelper(portName, type);
+    std::ofstream file(filename);
+
+    if (file.is_open()) {
+        file.close();
+        return true;
+    }
+    return false;
+}
+
+Status getPortModeHelper(const std::string portName, PortMode& portMode)  {
+    std::string filename = "/sys/class/dual_role_usb/" +
+    std::string(portName.c_str()) + "/supported_modes";
+    std::string modes;
+
+    if (readFile(filename, modes)) {
+        ALOGE("getSupportedRoles: Failed to open filesystem node");
+        return Status::ERROR;
+    }
+
+    if (modes == "ufp dfp")
+        portMode = PortMode::DRP;
+    else  if (modes == "ufp")
+        portMode = PortMode::UFP;
+    else if  (modes == "dfp")
+        portMode = PortMode::DFP;
+    else
+        return Status::UNRECOGNIZED_ROLE;
+
+        return Status::SUCCESS;
+}
+
+Status getPortStatusHelper (hidl_vec<PortStatus>& currentPortStatus) {
+    std::vector<std::string> names;
+    Status result = getTypeCPortNamesHelper(names);
+
+    if (result == Status::SUCCESS) {
+        currentPortStatus.resize(names.size());
+        for(std::vector<std::string>::size_type i = 0; i != names.size(); i++) {
+            ALOGI("%s", names[i].c_str());
+            currentPortStatus[i].portName = names[i];
+
+            uint32_t currentRole;
+            if (getCurrentRoleHelper(names[i], PortRoleType::POWER_ROLE,
+                    currentRole) == Status::SUCCESS) {
+                currentPortStatus[i].currentPowerRole =
+                static_cast<PortPowerRole> (currentRole);
+            } else {
+                ALOGE("Error while retreiving portNames");
+                goto done;
+            }
+
+            if (getCurrentRoleHelper(names[i],
+                    PortRoleType::DATA_ROLE, currentRole) == Status::SUCCESS) {
+                currentPortStatus[i].currentDataRole =
+                        static_cast<PortDataRole> (currentRole);
+            } else {
+                ALOGE("Error while retreiving current port role");
+                goto done;
+            }
+
+            if (getCurrentRoleHelper(names[i], PortRoleType::MODE,
+                    currentRole) == Status::SUCCESS) {
+                currentPortStatus[i].currentMode =
+                    static_cast<PortMode> (currentRole);
+            } else {
+                ALOGE("Error while retreiving current data role");
+                goto done;
+            }
+
+            currentPortStatus[i].canChangeMode =
+                canSwitchRoleHelper(names[i], PortRoleType::MODE);
+            currentPortStatus[i].canChangeDataRole =
+                canSwitchRoleHelper(names[i], PortRoleType::DATA_ROLE);
+            currentPortStatus[i].canChangePowerRole =
+                canSwitchRoleHelper(names[i], PortRoleType::POWER_ROLE);
+
+            ALOGI("canChangeMode: %d canChagedata: %d canChangePower:%d",
+                currentPortStatus[i].canChangeMode,
+                currentPortStatus[i].canChangeDataRole,
+                currentPortStatus[i].canChangePowerRole);
+
+            if (getPortModeHelper(names[i], currentPortStatus[i].supportedModes)
+                  != Status::SUCCESS) {
+                ALOGE("Error while retrieving port modes");
+                goto done;
+            }
+        }
+        return Status::SUCCESS;
+    }
+done:
+    return Status::ERROR;
+}
+
+Return<void> Usb::queryPortStatus() {
+    hidl_vec<PortStatus> currentPortStatus;
+    Status status;
+
+    status = getPortStatusHelper(currentPortStatus);
+    Return<void> ret = mCallback->notifyPortStatusChange(currentPortStatus,
+       status);
+    if (!ret.isOk())
+        ALOGE("queryPortStatus error %s", ret.description().c_str());
+
+    return Void();
+}
+struct data {
+    int uevent_fd;
+    android::hardware::usb::V1_0::implementation::Usb *usb;
+};
+
+static void uevent_event(uint32_t /*epevents*/, struct data *payload) {
+    char msg[UEVENT_MSG_LEN + 2];
+    char *cp;
+    int n;
+
+    n = uevent_kernel_multicast_recv(payload->uevent_fd, msg, UEVENT_MSG_LEN);
+    if (n <= 0)
+        return;
+    if (n >= UEVENT_MSG_LEN)   /* overflow -- discard */
+        return;
+
+    msg[n] = '\0';
+    msg[n + 1] = '\0';
+    cp = msg;
+
+    while (*cp) {
+        if (!strcmp(cp, "SUBSYSTEM=dual_role_usb")) {
+            ALOGE("uevent received %s", cp);
+            if (payload->usb->mCallback != NULL) {
+                hidl_vec<PortStatus> currentPortStatus;
+                Status status = getPortStatusHelper(currentPortStatus);
+                Return<void> ret =
+                    payload->usb->mCallback->notifyPortStatusChange(currentPortStatus, status);
+                if (!ret.isOk())
+                    ALOGE("error %s", ret.description().c_str());
+            }
+            break;
+        }
+        /* advance to after the next \0 */
+        while (*cp++);
+    }
+}
+
+void* work(void* param) {
+    int epoll_fd, uevent_fd;
+    struct epoll_event ev;
+    int nevents = 0;
+    struct data payload;
+
+    ALOGE("creating thread");
+
+    uevent_fd = uevent_open_socket(64*1024, true);
+
+    if (uevent_fd < 0) {
+        ALOGE("uevent_init: uevent_open_socket failed\n");
+        return NULL;
+    }
+
+    payload.uevent_fd = uevent_fd;
+    payload.usb = (android::hardware::usb::V1_0::implementation::Usb *)param;
+
+    fcntl(uevent_fd, F_SETFL, O_NONBLOCK);
+
+    ev.events = EPOLLIN;
+    ev.data.ptr = (void *)uevent_event;
+
+    epoll_fd = epoll_create(64);
+    if (epoll_fd == -1) {
+        ALOGE("epoll_create failed; errno=%d", errno);
+        goto error;
+    }
+
+    if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, uevent_fd, &ev) == -1) {
+        ALOGE("epoll_ctl failed; errno=%d", errno);
+        goto error;
+    }
+
+    while (1) {
+        struct epoll_event events[64];
+
+        nevents = epoll_wait(epoll_fd, events, 64, -1);
+        if (nevents == -1) {
+            if (errno == EINTR)
+                continue;
+            ALOGE("usb epoll_wait failed; errno=%d", errno);
+            break;
+        }
+
+        for (int n = 0; n < nevents; ++n) {
+            if (events[n].data.ptr)
+                (*(void (*)(int, struct data *payload))events[n].data.ptr)
+                    (events[n].events, &payload);
+        }
+    }
+
+error:
+    close(uevent_fd);
+
+    if (epoll_fd >= 0)
+        close(epoll_fd);
+
+    return NULL;
+}
+
+
+Return<void> Usb::setCallback(const sp<IUsbCallback>& callback) {
+
+    if (mCallback != NULL) {
+        ALOGE("Callback already registered");
+        return Void();
+    }
+
+    mCallback = callback;
+    ALOGI("registering callback");
+
+    if (pthread_create(&mPoll, NULL, work, this)) {
+        ALOGE("pthread creation failed %d", errno);
+        mCallback = NULL;
+        return Void();
+    }
+
+    return Void();
+}
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace usb
+}  // namespace hardware
+}  // namespace android
diff --git a/usb/1.0/default/Usb.h b/usb/1.0/default/Usb.h
new file mode 100644
index 0000000..cf418f4
--- /dev/null
+++ b/usb/1.0/default/Usb.h
@@ -0,0 +1,50 @@
+#ifndef ANDROID_HARDWARE_USB_V1_0_USB_H
+#define ANDROID_HARDWARE_USB_V1_0_USB_H
+
+#include <android/hardware/usb/1.0/IUsb.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+#include <utils/Log.h>
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+#define LOG_TAG "android.hardware.usb@1.0-service"
+#define UEVENT_MSG_LEN 2048
+
+namespace android {
+namespace hardware {
+namespace usb {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hardware::usb::V1_0::IUsb;
+using ::android::hardware::usb::V1_0::IUsbCallback;
+using ::android::hardware::usb::V1_0::PortRole;
+using ::android::hidl::base::V1_0::IBase;
+using ::android::hardware::hidl_array;
+using ::android::hardware::hidl_memory;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+struct Usb : public IUsb {
+    Return<void> switchRole(const hidl_string& portName, const PortRole& role) override;
+    Return<void> setCallback(const sp<IUsbCallback>& callback) override;
+    Return<void> queryPortStatus() override;
+
+    sp<IUsbCallback> mCallback;
+    private:
+        pthread_t mPoll;
+};
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace usb
+}  // namespace hardware
+}  // namespace android
+
+#endif  // ANDROID_HARDWARE_USB_V1_0_USB_H
diff --git a/usb/1.0/default/android.hardware.usb@1.0-service.rc b/usb/1.0/default/android.hardware.usb@1.0-service.rc
new file mode 100644
index 0000000..77dfc93
--- /dev/null
+++ b/usb/1.0/default/android.hardware.usb@1.0-service.rc
@@ -0,0 +1,4 @@
+service usb-hal-1-0 /system/bin/hw/android.hardware.usb@1.0-service
+    class hal
+    user system
+    group system
diff --git a/usb/1.0/default/service.cpp b/usb/1.0/default/service.cpp
new file mode 100644
index 0000000..b4db241
--- /dev/null
+++ b/usb/1.0/default/service.cpp
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+#include <hidl/HidlTransportSupport.h>
+#include "Usb.h"
+
+using android::sp;
+
+// libhwbinder:
+using android::hardware::configureRpcThreadpool;
+using android::hardware::joinRpcThreadpool;
+
+// Generated HIDL files
+using android::hardware::usb::V1_0::IUsb;
+using android::hardware::usb::V1_0::implementation::Usb;
+
+int main() {
+    const char instance[] = "usb_hal";
+
+    android::sp<IUsb> service = new Usb();
+
+    configureRpcThreadpool(1, true /*callerWillJoin*/);
+    service->registerAsService(instance);
+
+    ALOGI("USB HAL Ready.");
+    joinRpcThreadpool();
+}
diff --git a/usb/1.0/types.hal b/usb/1.0/types.hal
new file mode 100644
index 0000000..17cd8c7
--- /dev/null
+++ b/usb/1.0/types.hal
@@ -0,0 +1,214 @@
+/*
+ * 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 android.hardware.usb@1.0;
+
+
+enum Status : uint32_t {
+    SUCCESS = 0,
+
+    /*
+     * error value when the HAL operation fails for reasons not listed here.
+     */
+    ERROR = 1,
+
+    /*
+     * error value returned when input argument is invalid.
+     */
+    INVALID_ARGUMENT = 2,
+
+    /*
+     * error value returned when role string is unrecognized.
+     */
+    UNRECOGNIZED_ROLE = 3,
+};
+
+/*
+ * Denotes the Port role type.
+ * Passed as an argument for functions used to query or change port roles.
+ */
+enum PortRoleType : uint32_t {
+    /*
+     * Denotes the data role of the port.
+     * The port can either be a "host" or a "device" for data.
+     * This maps to the PortDataRole enum.
+     */
+    DATA_ROLE = 0,
+
+    /*
+     * Denotes the power role of the port.
+     * The port can either be a "source" or "sink" for power.
+     * This maps to PortPowerRole enum.
+     */
+    POWER_ROLE = 1,
+
+    /*
+     * USB ports can be a pure DFP port which can only act
+     * as a host. A UFP port which can only act as a device.
+     * Or a dual role ports which can either can as a host or
+     * a device. This property is used to mention them.
+     */
+    MODE = 2,
+};
+
+@export
+enum PortDataRole : uint32_t {
+    /*
+     * Indicates that the port does not have a data role.
+     * In case of DRP, the current data role of the port is only resolved
+     * when the type-c handshake happens.
+     */
+    NONE = 0,
+
+    /*
+     * Indicates that the port is acting as a host for data.
+     */
+    HOST = 1,
+
+    /*
+     * Indicated that the port is acting as a device for data.
+     */
+    DEVICE = 2,
+
+    NUM_DATA_ROLES = 3,
+};
+
+@export
+enum PortPowerRole : uint32_t {
+    /*
+     * Indicates that the port does not have a power role.
+     * In case of DRP, the current power role of the port is only resolved
+     * when the type-c handshake happens.
+     */
+    NONE = 0,
+
+    /*
+     * Indicates that the port is supplying power to the other port.
+     */
+    SOURCE = 1,
+
+    /*
+     * Indicates that the port is sinking power from the other port.
+     */
+    SINK = 2,
+
+    NUM_POWER_ROLES = 3,
+};
+
+@export
+enum PortMode : uint32_t {
+    /*
+     * Indicates that the port does not have a mode.
+     * In case of DRP, the current mode of the port is only resolved
+     * when the type-c handshake happens.
+     */
+    NONE = 0,
+    /*
+     * Indicates that port can only act as device for data and sink for power.
+     */
+    UFP = 1,
+
+    /*
+     * Indicates the port can only act as host for data and source for power.
+     */
+    DFP = 2,
+
+    /*
+     * Indicates can either act as UFP or DFP at a given point of time.
+     */
+    DRP = 3,
+
+    NUM_MODES = 4,
+};
+
+/*
+ * Used as a container to send port role information.
+ */
+struct PortRole {
+    /*
+     * Indicates the type of Port Role.
+     * Maps to the PortRoleType enum.
+     */
+    PortRoleType type;
+
+    /*
+     * when type is HAL_USB_DATA_ROLE pass values from enum PortDataRole.
+     * when type is HAL_USB_POWER_ROLE pass values from enum PortPowerRole.
+     * when type is HAL_USB_MODE pass values from enum PortMode.
+     */
+    uint32_t role;
+};
+
+/*
+ * Used as the container to report data back to the caller.
+ * Represents the current connection status of a single USB port.
+ */
+struct PortStatus {
+     /*
+      * Name of the port.
+      * Used as the port's id by the caller.
+      */
+     string portName;
+
+     /*
+      * Data role of the port.
+      */
+     PortDataRole currentDataRole;
+
+     /*
+      * Power Role of thte port.
+      */
+     PortPowerRole currentPowerRole;
+
+     /*
+      * Mode in which the port is connected.
+      * Can be UFP or DFP.
+      */
+     PortMode currentMode;
+
+     /*
+      * True indicates that the port's mode can
+      * be changed. False otherwise.
+      */
+     bool canChangeMode;
+
+     /*
+      * True indicates that the port's data role
+      * can be changed. False otherwise.
+      * For example, true if Type-C PD PD_SWAP
+      * is supported.
+      */
+     bool canChangeDataRole;
+
+     /*
+      * True indicates that the port's power role
+      * can be changed. False otherwise.
+      * For example, true if Type-C PD PR_SWAP
+      * is supported.
+      */
+     bool canChangePowerRole;
+
+     /*
+      * Identifies the type of the local port.
+      *
+      * UFP - Indicates that port can only act as device for
+      *       data and sink for power.
+      * DFP - Indicates the port can only act as host for data
+      *       and source for power.
+      * DRP - Indicates can either act as UFP or DFP at a
+      *       given point of time.
+      */
+      PortMode supportedModes;
+};
diff --git a/usb/Android.bp b/usb/Android.bp
new file mode 100644
index 0000000..bbb3e4b
--- /dev/null
+++ b/usb/Android.bp
@@ -0,0 +1,4 @@
+// This is an autogenerated file, do not edit.
+subdirs = [
+    "1.0",
+]
diff --git a/vehicle/2.0/default/tests/VehicleHalManager_test.cpp b/vehicle/2.0/default/tests/VehicleHalManager_test.cpp
index dffcfbb..4a20ea5 100644
--- a/vehicle/2.0/default/tests/VehicleHalManager_test.cpp
+++ b/vehicle/2.0/default/tests/VehicleHalManager_test.cpp
@@ -353,7 +353,7 @@
 TEST_F(VehicleHalManagerTest, get_NegativeCases) {
     // Write-only property must fail.
     invokeGet(VehicleProperty::HVAC_SEAT_TEMPERATURE, 0);
-    ASSERT_EQ(StatusCode::INVALID_ARG, actualStatusCode);
+    ASSERT_EQ(StatusCode::ACCESS_DENIED, actualStatusCode);
 
     // Unknown property must fail.
     invokeGet(VehicleProperty::MIRROR_Z_MOVE, 0);
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp
index b4eb484..5d2e6fe 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.cpp
@@ -87,7 +87,7 @@
     }
 
     if (!checkReadPermission(*config, getCaller())) {
-        _hidl_cb(StatusCode::INVALID_ARG, kEmptyValue);
+        _hidl_cb(StatusCode::ACCESS_DENIED, kEmptyValue);
         return Void();
     }
 
@@ -108,7 +108,7 @@
     }
 
     if (!checkWritePermission(*config, getCaller())) {
-        return StatusCode::INVALID_ARG;
+        return StatusCode::ACCESS_DENIED;
     }
 
     handlePropertySetEvent(value);
@@ -122,6 +122,7 @@
         const sp<IVehicleCallback> &callback,
         const hidl_vec<SubscribeOptions> &options) {
     hidl_vec<SubscribeOptions> verifiedOptions(options);
+    auto caller = getCaller();
     for (size_t i = 0; i < verifiedOptions.size(); i++) {
         SubscribeOptions& ops = verifiedOptions[i];
         VehicleProperty prop = ops.propId;
@@ -133,6 +134,10 @@
             return StatusCode::INVALID_ARG;
         }
 
+        if (!checkAcl(caller.uid, config->prop, VehiclePropertyAccess::READ)) {
+            return StatusCode::ACCESS_DENIED;
+        }
+
         if (!isSubscribable(*config, ops.flags)) {
             ALOGE("Failed to subscribe: property 0x%x is not subscribable",
                   prop);
@@ -304,15 +309,13 @@
     return true;
 }
 
-bool checkAcl(const PropertyAclMap& aclMap,
-              uid_t callerUid,
-              VehicleProperty propertyId,
-              VehiclePropertyAccess requiredAccess) {
+bool VehicleHalManager::checkAcl(uid_t callerUid, VehicleProperty propertyId,
+                                 VehiclePropertyAccess requiredAccess) const {
     if (callerUid == AID_SYSTEM && isSystemProperty(propertyId)) {
         return true;
     }
 
-    auto range = aclMap.equal_range(propertyId);
+    auto range = mPropertyAclMap.equal_range(propertyId);
     for (auto it = range.first; it != range.second; ++it) {
         auto& acl = it->second;
         if (acl.uid == callerUid && (acl.access & requiredAccess)) {
@@ -328,8 +331,7 @@
         ALOGW("Property 0%x has no write access", config.prop);
         return false;
     }
-    return checkAcl(mPropertyAclMap, caller.uid, config.prop,
-                    VehiclePropertyAccess::WRITE);
+    return checkAcl(caller.uid, config.prop, VehiclePropertyAccess::WRITE);
 }
 
 bool VehicleHalManager::checkReadPermission(const VehiclePropConfig &config,
@@ -339,8 +341,7 @@
         return false;
     }
 
-    return checkAcl(mPropertyAclMap, caller.uid, config.prop,
-                    VehiclePropertyAccess::READ);
+    return checkAcl(caller.uid, config.prop, VehiclePropertyAccess::READ);
 }
 
 void VehicleHalManager::handlePropertySetEvent(const VehiclePropValue& value) {
diff --git a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h
index 519b09b..6768741 100644
--- a/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h
+++ b/vehicle/2.0/default/vehicle_hal_manager/VehicleHalManager.h
@@ -100,6 +100,9 @@
                               const Caller& callee) const;
     bool checkReadPermission(const VehiclePropConfig &config,
                              const Caller& caller) const;
+    bool checkAcl(uid_t callerUid,
+                  VehicleProperty propertyId,
+                  VehiclePropertyAccess requiredAccess) const;
 
     static bool isSubscribable(const VehiclePropConfig& config,
                                SubscribeFlags flags);
diff --git a/vehicle/2.0/vts/functional/vts/testcases/hal/vehicle/hidl/host/VehicleHidlTest.py b/vehicle/2.0/vts/functional/vts/testcases/hal/vehicle/hidl/host/VehicleHidlTest.py
index 5faf78a..cd52abf 100644
--- a/vehicle/2.0/vts/functional/vts/testcases/hal/vehicle/hidl/host/VehicleHidlTest.py
+++ b/vehicle/2.0/vts/functional/vts/testcases/hal/vehicle/hidl/host/VehicleHidlTest.py
@@ -20,6 +20,7 @@
 
 from vts.runners.host import asserts
 from vts.runners.host import base_test_with_webdb
+from vts.runners.host import const
 from vts.runners.host import test_runner
 from vts.utils.python.controllers import android_device
 from vts.utils.python.profiling import profiling_utils
@@ -35,6 +36,10 @@
         self.dut.shell.InvokeTerminal("one")
         self.dut.shell.one.Execute("setenforce 0")  # SELinux permissive mode
 
+        results = self.dut.shell.one.Execute("id -u system")
+        system_uid = results[const.STDOUT][0].strip()
+        logging.info("system_uid: %s", system_uid)
+
         self.dut.hal.InitHidlHal(
             target_type="vehicle",
             target_basepaths=self.dut.libPaths,
@@ -45,6 +50,7 @@
             bits=64 if self.dut.is64Bit else 32)
 
         self.vehicle = self.dut.hal.vehicle  # shortcut
+        self.vehicle.SetCallerUid(system_uid)
         self.vtypes = self.dut.hal.vehicle.GetHidlTypeInterface("types")
         logging.info("vehicle types: %s", self.vtypes)
 
diff --git a/vibrator/1.0/default/Vibrator.cpp b/vibrator/1.0/default/Vibrator.cpp
index e86e681..8c82bcd 100644
--- a/vibrator/1.0/default/Vibrator.cpp
+++ b/vibrator/1.0/default/Vibrator.cpp
@@ -50,18 +50,18 @@
     return Status::OK;
 }
 
-IVibrator* HIDL_FETCH_IVibrator(const char *hal) {
+IVibrator* HIDL_FETCH_IVibrator(const char * /*hal*/) {
     vibrator_device_t *vib_device;
     const hw_module_t *hw_module = nullptr;
 
-    int ret = hw_get_module(hal, &hw_module);
+    int ret = hw_get_module(VIBRATOR_HARDWARE_MODULE_ID, &hw_module);
     if (ret == 0) {
         ret = vibrator_open(hw_module, &vib_device);
         if (ret != 0) {
-            ALOGE("vibrator_open %s failed: %d", hal, ret);
+            ALOGE("vibrator_open failed: %d", ret);
         }
     } else {
-        ALOGE("hw_get_module %s failed: %d", hal, ret);
+        ALOGE("hw_get_module %s failed: %d", VIBRATOR_HARDWARE_MODULE_ID, ret);
     }
 
     if (ret == 0) {
diff --git a/vibrator/1.0/vts/functional/vibrator_hidl_hal_test.cpp b/vibrator/1.0/vts/functional/vibrator_hidl_hal_test.cpp
index ec8db3a..782a763 100644
--- a/vibrator/1.0/vts/functional/vibrator_hidl_hal_test.cpp
+++ b/vibrator/1.0/vts/functional/vibrator_hidl_hal_test.cpp
@@ -28,13 +28,11 @@
 using ::android::hardware::Void;
 using ::android::sp;
 
-#define VIBRATOR_SERVICE_NAME "vibrator"
-
 // The main test class for VIBRATOR HIDL HAL.
 class VibratorHidlTest : public ::testing::Test {
  public:
   virtual void SetUp() override {
-    vibrator = IVibrator::getService(VIBRATOR_SERVICE_NAME, false);
+    vibrator = IVibrator::getService(false);
     ASSERT_NE(vibrator, nullptr);
   }
 
diff --git a/vibrator/1.0/vts/functional/vts/testcases/hal/vibrator/hidl/host/VibratorHidlTest.py b/vibrator/1.0/vts/functional/vts/testcases/hal/vibrator/hidl/host/VibratorHidlTest.py
index 498ea06..84f2907 100644
--- a/vibrator/1.0/vts/functional/vts/testcases/hal/vibrator/hidl/host/VibratorHidlTest.py
+++ b/vibrator/1.0/vts/functional/vts/testcases/hal/vibrator/hidl/host/VibratorHidlTest.py
@@ -45,7 +45,6 @@
             target_version=1.0,
             target_package="android.hardware.vibrator",
             target_component_name="IVibrator",
-            hw_binder_service_name="vibrator",
             bits=64 if self.dut.is64Bit else 32)
 
     def tearDownClass(self):
diff --git a/vr/1.0/vts/functional/vts/testcases/hal/vr/hidl/target/AndroidTest.xml b/vr/1.0/vts/functional/vts/testcases/hal/vr/hidl/target/AndroidTest.xml
index aa5a48f..8c7a9b7 100644
--- a/vr/1.0/vts/functional/vts/testcases/hal/vr/hidl/target/AndroidTest.xml
+++ b/vr/1.0/vts/functional/vts/testcases/hal/vr/hidl/target/AndroidTest.xml
@@ -25,9 +25,11 @@
             _64bit::DATA/nativetest64/vr_hidl_hal_test/vr_hidl_hal_test,
             "/>
         <option name="binary-test-type" value="hal_hidl_gtest" />
-        <option name="hwbinder-service" value="android.hardware.vr" />
+        <!-- Uncomment this and comment 'precondition-feature' to run this test
+             only on devices using binderized VR HALs.
+        <option name="precondition-hwbinder-service" value="android.hardware.vr" /> -->
+        <option name="precondition-feature" value="android.hardware.vr.high_performance" />
         <option name="test-timeout" value="1m" />
         <option name="test-config-path" value="vts/testcases/hal/vr/hidl/target/VrHidlTargetTest.config" />
 </test>
 </configuration>
-
diff --git a/wifi/1.0/default/hidl_struct_util.cpp b/wifi/1.0/default/hidl_struct_util.cpp
index bbb9346..37fcfea 100644
--- a/wifi/1.0/default/hidl_struct_util.cpp
+++ b/wifi/1.0/default/hidl_struct_util.cpp
@@ -887,7 +887,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanPublishRequest));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanPublishRequest));
 
   legacy_request->publish_id = hidl_request.baseConfigs.sessionId;
   legacy_request->ttl = hidl_request.baseConfigs.ttlSec;
@@ -959,7 +959,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanSubscribeRequest));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanSubscribeRequest));
 
   legacy_request->subscribe_id = hidl_request.baseConfigs.sessionId;
   legacy_request->ttl = hidl_request.baseConfigs.ttlSec;
@@ -1044,7 +1044,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanTransmitFollowupRequest));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanTransmitFollowupRequest));
 
   legacy_request->publish_subscribe_id = hidl_request.discoverySessionId;
   legacy_request->requestor_instance_id = hidl_request.peerId;
@@ -1071,7 +1071,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanConfigRequest));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanConfigRequest));
 
   // TODO: b/34059183 tracks missing configurations in legacy HAL or uknown defaults
   legacy_request->master_pref = hidl_request.masterPref;
@@ -1161,7 +1161,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanBeaconSdfPayloadRequest));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanBeaconSdfPayloadRequest));
 
   legacy_request->vsa.payload_transmit_flag = hidl_request.transmitInNext16dws ? 1 : 0;
   legacy_request->vsa.tx_in_discovery_beacon = hidl_request.transmitInDiscoveryBeacon;
@@ -1183,7 +1183,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanDataPathInitiatorRequest));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanDataPathInitiatorRequest));
 
   legacy_request->requestor_instance_id = hidl_request.peerId;
   memcpy(legacy_request->peer_disc_mac_addr, hidl_request.peerDiscMacAddr.data(), 6);
@@ -1215,7 +1215,7 @@
   if (!legacy_request) {
     return false;
   }
-  memset(&legacy_request, 0, sizeof(legacy_hal::NanDataPathIndicationResponse));
+  memset(legacy_request, 0, sizeof(legacy_hal::NanDataPathIndicationResponse));
 
   legacy_request->rsp_code = hidl_request.acceptRequest ?
         legacy_hal::NAN_DP_REQUEST_ACCEPT : legacy_hal::NAN_DP_REQUEST_REJECT;
diff --git a/wifi/1.0/default/service.cpp b/wifi/1.0/default/service.cpp
index 40e8b12..96d5c6f 100644
--- a/wifi/1.0/default/service.cpp
+++ b/wifi/1.0/default/service.cpp
@@ -34,7 +34,7 @@
   // Setup hwbinder service
   android::sp<android::hardware::wifi::V1_0::IWifi> service =
       new android::hardware::wifi::V1_0::implementation::Wifi();
-  CHECK_EQ(service->registerAsService("wifi"), android::NO_ERROR)
+  CHECK_EQ(service->registerAsService(), android::NO_ERROR)
       << "Failed to register wifi HAL";
 
   joinRpcThreadpool();
diff --git a/wifi/1.0/vts/Android.mk b/wifi/1.0/vts/Android.mk
new file mode 100644
index 0000000..d347136
--- /dev/null
+++ b/wifi/1.0/vts/Android.mk
@@ -0,0 +1,20 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+# include hidl test makefiles
+include $(LOCAL_PATH)/functional/vts/testcases/hal/wifi/hidl/Android.mk
diff --git a/wifi/1.0/vts/functional/vts/testcases/hal/wifi/__init__.py b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/__init__.py
diff --git a/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/Android.mk b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/Android.mk
new file mode 100644
index 0000000..f9e3276
--- /dev/null
+++ b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/Android.mk
@@ -0,0 +1,19 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(call all-subdir-makefiles)
diff --git a/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/__init__.py b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/__init__.py
diff --git a/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/target/Android.mk b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/target/Android.mk
new file mode 100644
index 0000000..40f154e
--- /dev/null
+++ b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/target/Android.mk
@@ -0,0 +1,23 @@
+#
+# 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := HalWifiHidlTargetTest
+VTS_CONFIG_SRC_DIR := testcases/hal/wifi/hidl/target
+include test/vts/tools/build/Android.host_config.mk
diff --git a/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/target/AndroidTest.xml b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/target/AndroidTest.xml
new file mode 100644
index 0000000..1099a5a
--- /dev/null
+++ b/wifi/1.0/vts/functional/vts/testcases/hal/wifi/hidl/target/AndroidTest.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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.
+-->
+<configuration description="Config for VTS WiFi HIDL HAL's basic target-side test cases">
+    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsFilePusher">
+        <option name="push-group" value="HidlHalTest.push" />
+    </target_preparer>
+    <target_preparer class="com.android.tradefed.targetprep.VtsPythonVirtualenvPreparer" />
+    <test class="com.android.tradefed.testtype.VtsMultiDeviceTest">
+        <option name="test-module-name" value="HalWifiHidlTargetTest" />
+        <option name="binary-test-sources" value="
+            _32bit::DATA/nativetest/wifi_hidl_test/wifi_hidl_test,
+            _64bit::DATA/nativetest64/wifi_hidl_test/wifi_hidl_test,
+            "/>
+        <option name="binary-test-type" value="gtest" />
+        <option name="test-timeout" value="10m" />
+    </test>
+</configuration>
diff --git a/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp b/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
index f88b866..050bba3 100644
--- a/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
+++ b/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
@@ -34,8 +34,6 @@
 using ::android::hardware::hidl_string;
 using ::android::hardware::hidl_vec;
 
-const char kWifiServiceName[] = "wifi";
-
 void stopFramework() {
     ASSERT_EQ(std::system("svc wifi disable"), 0);
     sleep(5);
@@ -44,7 +42,7 @@
 void startFramework() { ASSERT_EQ(std::system("svc wifi enable"), 0); }
 
 sp<IWifi> getWifi() {
-    sp<IWifi> wifi = IWifi::getService(kWifiServiceName);
+    sp<IWifi> wifi = IWifi::getService();
     return wifi;
 }
 
diff --git a/wifi/supplicant/1.0/vts/functional/supplicant_hidl_test_utils.cpp b/wifi/supplicant/1.0/vts/functional/supplicant_hidl_test_utils.cpp
index 3877b97..2f3405d 100644
--- a/wifi/supplicant/1.0/vts/functional/supplicant_hidl_test_utils.cpp
+++ b/wifi/supplicant/1.0/vts/functional/supplicant_hidl_test_utils.cpp
@@ -49,7 +49,7 @@
 using ::android::wifi_system::SupplicantManager;
 
 namespace {
-const char kSupplicantServiceName[] = "wpa_supplicant";
+const char kSupplicantServiceName[] = "default";
 
 // Helper function to initialize the driver and firmware to STA mode.
 void initilializeDriverAndFirmware() {