Merge "Initial submit of Vehicle HAL 2.1"
diff --git a/biometrics/fingerprint/2.1/vts/functional/Android.bp b/biometrics/fingerprint/2.1/vts/functional/Android.bp
index 7d2e83f..25f7cc0 100644
--- a/biometrics/fingerprint/2.1/vts/functional/Android.bp
+++ b/biometrics/fingerprint/2.1/vts/functional/Android.bp
@@ -30,12 +30,8 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
 
diff --git a/bluetooth/1.0/vts/functional/Android.bp b/bluetooth/1.0/vts/functional/Android.bp
index 7d04736..086ac99 100644
--- a/bluetooth/1.0/vts/functional/Android.bp
+++ b/bluetooth/1.0/vts/functional/Android.bp
@@ -31,11 +31,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
     ],
-    ldflags: [
-        "--coverage",
-    ],
 }
diff --git a/boot/1.0/vts/functional/Android.bp b/boot/1.0/vts/functional/Android.bp
index 714a18b..6c28bf1 100644
--- a/boot/1.0/vts/functional/Android.bp
+++ b/boot/1.0/vts/functional/Android.bp
@@ -30,11 +30,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
diff --git a/configstore/1.0/ISurfaceFlingerConfigs.hal b/configstore/1.0/ISurfaceFlingerConfigs.hal
index 97dc915..4403a90 100644
--- a/configstore/1.0/ISurfaceFlingerConfigs.hal
+++ b/configstore/1.0/ISurfaceFlingerConfigs.hal
@@ -17,4 +17,5 @@
 
 interface ISurfaceFlingerConfigs {
     vsyncEventPhaseOffsetNs() generates (OptionalInt64 value);
+    useTripleFramebuffer() generates (OptionalBool value);
 };
diff --git a/configstore/1.0/default/SurfaceFlingerConfigs.cpp b/configstore/1.0/default/SurfaceFlingerConfigs.cpp
index fc75182..5d62b15 100644
--- a/configstore/1.0/default/SurfaceFlingerConfigs.cpp
+++ b/configstore/1.0/default/SurfaceFlingerConfigs.cpp
@@ -19,6 +19,15 @@
     return Void();
 }
 
+Return<void> SurfaceFlingerConfigs::useTripleFramebuffer(useTripleFramebuffer_cb _hidl_cb) {
+    bool value = false;
+#ifdef USE_TRIPLE_FRAMEBUFFER
+    value = true;
+#endif
+    _hidl_cb({true, value});
+    LOG(INFO) << "SurfaceFlinger FrameBuffer: " << (value ? "triple" : "double");
+    return Void();
+}
 
 // Methods from ::android::hidl::base::V1_0::IBase follow.
 
diff --git a/configstore/1.0/default/SurfaceFlingerConfigs.h b/configstore/1.0/default/SurfaceFlingerConfigs.h
index 5c754a0..c9652fc 100644
--- a/configstore/1.0/default/SurfaceFlingerConfigs.h
+++ b/configstore/1.0/default/SurfaceFlingerConfigs.h
@@ -25,6 +25,7 @@
 struct SurfaceFlingerConfigs : public ISurfaceFlingerConfigs {
     // Methods from ::android::hardware::configstore::V1_0::ISurfaceFlingerConfigs follow.
     Return<void> vsyncEventPhaseOffsetNs(vsyncEventPhaseOffsetNs_cb _hidl_cb) override;
+    Return<void> useTripleFramebuffer(useTripleFramebuffer_cb _hidl_cb) override;
 
     // Methods from ::android::hidl::base::V1_0::IBase follow.
 
diff --git a/configstore/1.0/default/surfaceflinger.mk b/configstore/1.0/default/surfaceflinger.mk
index 42fa191..5a946f4 100644
--- a/configstore/1.0/default/surfaceflinger.mk
+++ b/configstore/1.0/default/surfaceflinger.mk
@@ -4,3 +4,7 @@
 ifneq ($(VSYNC_EVENT_PHASE_OFFSET_NS),)
     LOCAL_CFLAGS += -DVSYNC_EVENT_PHASE_OFFSET_NS=$(VSYNC_EVENT_PHASE_OFFSET_NS)
 endif
+
+ifeq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),3)
+    LOCAL_CFLAGS += -DUSE_TRIPLE_FRAMEBUFFER
+endif
diff --git a/configstore/Android.bp b/configstore/Android.bp
index bbb3e4b..79b63f6 100644
--- a/configstore/Android.bp
+++ b/configstore/Android.bp
@@ -1,4 +1,5 @@
 // This is an autogenerated file, do not edit.
 subdirs = [
     "1.0",
+    "utils",
 ]
diff --git a/configstore/utils/Android.bp b/configstore/utils/Android.bp
new file mode 100644
index 0000000..32053a7
--- /dev/null
+++ b/configstore/utils/Android.bp
@@ -0,0 +1,28 @@
+//
+// 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_library_static {
+    name: "android.hardware.configstore-utils",
+    export_include_dirs: ["include"],
+    srcs: [],
+    shared_libs: [
+        "android.hardware.configstore@1.0",
+    ],
+    export_shared_lib_headers: [
+        "android.hardware.configstore@1.0",
+    ],
+}
+
diff --git a/configstore/utils/include/configstore/Utils.h b/configstore/utils/include/configstore/Utils.h
new file mode 100644
index 0000000..98ccae9
--- /dev/null
+++ b/configstore/utils/include/configstore/Utils.h
@@ -0,0 +1,94 @@
+//
+// 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.
+//
+
+#ifndef ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
+#define ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
+
+#include <hidl/Status.h>
+#include <stdatomic.h>
+
+namespace android {
+namespace hardware {
+namespace configstore {
+// arguments V: type for the value (i.e., OptionalXXX)
+//           I: interface class name
+//           func: member function pointer
+using namespace V1_0;
+
+template<typename V, typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const V&)>)>
+decltype(V::value) get(const decltype(V::value) &defValue) {
+    auto getHelper = []()->V {
+        V ret;
+        sp<I> configs = I::getService();
+
+        if (!configs.get()) {
+            // fallback to the default value
+            ret.specified = false;
+        } else {
+            (*configs.*func)([&ret](V v) {
+                ret = v;
+            });
+        }
+
+        return ret;
+    };
+    static V cachedValue = getHelper();
+
+    return cachedValue.specified ? cachedValue.value : defValue;
+}
+
+template<typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const OptionalBool&)>)>
+bool getBool(const bool defValue) {
+    return get<OptionalBool, I, func>(defValue);
+}
+
+template<typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const OptionalInt32&)>)>
+int32_t getInt32(const int32_t defValue) {
+    return get<OptionalInt32, I, func>(defValue);
+}
+
+template<typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const OptionalUInt32&)>)>
+uint32_t getUInt32(const uint32_t defValue) {
+    return get<OptionalUInt32, I, func>(defValue);
+}
+
+template<typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const OptionalInt64&)>)>
+int64_t getInt64(const int64_t defValue) {
+    return get<OptionalInt64, I, func>(defValue);
+}
+
+template<typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const OptionalUInt64&)>)>
+uint64_t getUInt64(const uint64_t defValue) {
+    return get<OptionalUInt64, I, func>(defValue);
+}
+
+template<typename I, android::hardware::Return<void> (I::* func)
+        (std::function<void(const OptionalString&)>)>
+std::string getString(const std::string &defValue) {
+    return get<OptionalString, I, func>(defValue);
+}
+
+}  // namespace configstore
+}  // namespace hardware
+}  // namespace android
+
+#endif  // ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
diff --git a/contexthub/1.0/vts/functional/Android.bp b/contexthub/1.0/vts/functional/Android.bp
index e78898e..1c011a0 100644
--- a/contexthub/1.0/vts/functional/Android.bp
+++ b/contexthub/1.0/vts/functional/Android.bp
@@ -27,12 +27,8 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage",
-    ],
+    ]
 }
 
diff --git a/drm/1.0/default/CryptoFactory.cpp b/drm/1.0/default/CryptoFactory.cpp
index 13cad67..e46233d 100644
--- a/drm/1.0/default/CryptoFactory.cpp
+++ b/drm/1.0/default/CryptoFactory.cpp
@@ -15,11 +15,10 @@
  */
 #define LOG_TAG "android.hardware.drm@1.0-impl"
 
-#include <utils/Log.h>
-
 #include "CryptoFactory.h"
 #include "CryptoPlugin.h"
 #include "TypeConvert.h"
+#include <utils/Log.h>
 
 namespace android {
 namespace hardware {
@@ -27,63 +26,45 @@
 namespace V1_0 {
 namespace implementation {
 
-CryptoFactory::CryptoFactory() :
-    trebleLoader("/vendor/lib/hw", "createCryptoFactory"),
-    legacyLoader("/vendor/lib/mediadrm", "createCryptoFactory") {
-}
-
-// Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow.
-Return<bool> CryptoFactory::isCryptoSchemeSupported(
-        const hidl_array<uint8_t, 16>& uuid) {
-    return isCryptoSchemeSupported(trebleLoader, uuid) ||
-            isCryptoSchemeSupported(legacyLoader, uuid);
-}
-
-Return<void> CryptoFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid,
-        const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb) {
-    sp<ICryptoPlugin> plugin = createTreblePlugin(uuid, initData);
-    if (plugin == nullptr) {
-        plugin = createLegacyPlugin(uuid, initData);
+    CryptoFactory::CryptoFactory() :
+        loader("/vendor/lib/mediadrm", "createCryptoFactory") {
     }
-    _hidl_cb(plugin != nullptr ? Status::OK : Status::ERROR_DRM_CANNOT_HANDLE, plugin);
-    return Void();
-}
 
-sp<ICryptoPlugin> CryptoFactory::createTreblePlugin(const hidl_array<uint8_t, 16>& uuid,
-        const hidl_vec<uint8_t>& initData) {
-    sp<ICryptoPlugin> plugin;
-    for (size_t i = 0; i < trebleLoader.factoryCount(); i++) {
-        Return<void> hResult = trebleLoader.getFactory(i)->createPlugin(uuid, initData,
-                [&](Status status, const sp<ICryptoPlugin>& hPlugin) {
-                    if (status == Status::OK) {
-                        plugin = hPlugin;
-                    }
+    // Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow.
+    Return<bool> CryptoFactory::isCryptoSchemeSupported(
+            const hidl_array<uint8_t, 16>& uuid) {
+        for (size_t i = 0; i < loader.factoryCount(); i++) {
+            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    Return<void> CryptoFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid,
+            const hidl_vec<uint8_t>& initData, createPlugin_cb _hidl_cb) {
+        for (size_t i = 0; i < loader.factoryCount(); i++) {
+            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
+                android::CryptoPlugin *legacyPlugin = NULL;
+                status_t status = loader.getFactory(i)->createPlugin(uuid.data(),
+                        initData.data(), initData.size(), &legacyPlugin);
+                CryptoPlugin *newPlugin = NULL;
+                if (legacyPlugin == NULL) {
+                    ALOGE("Crypto legacy HAL: failed to create crypto plugin");
+                } else {
+                    newPlugin = new CryptoPlugin(legacyPlugin);
                 }
-            );
-        if (plugin != nullptr) {
-            return plugin;
+                _hidl_cb(toStatus(status), newPlugin);
+                return Void();
+            }
         }
+        _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, NULL);
+        return Void();
     }
-    return nullptr;
-}
 
-sp<ICryptoPlugin> CryptoFactory::createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid,
-        const hidl_vec<uint8_t>& initData) {
-    android::CryptoPlugin *legacyPlugin = nullptr;
-    for (size_t i = 0; i < legacyLoader.factoryCount(); i++) {
-        legacyLoader.getFactory(i)->createPlugin(uuid.data(),
-                initData.data(), initData.size(), &legacyPlugin);
-        if (legacyPlugin) {
-            return new CryptoPlugin(legacyPlugin);
-        }
+    ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char* /* name */) {
+        return new CryptoFactory();
     }
-    return nullptr;
-}
-
-
-ICryptoFactory* HIDL_FETCH_ICryptoFactory(const char* /* name */) {
-    return new CryptoFactory();
-}
 
 }  // namespace implementation
 }  // namespace V1_0
diff --git a/drm/1.0/default/CryptoFactory.h b/drm/1.0/default/CryptoFactory.h
index d774406..412b557 100644
--- a/drm/1.0/default/CryptoFactory.h
+++ b/drm/1.0/default/CryptoFactory.h
@@ -41,7 +41,8 @@
     CryptoFactory();
     virtual ~CryptoFactory() {}
 
-    // Methods from ::android::hardware::drmn::V1_0::ICryptoFactory follow.
+    // Methods from ::android::hardware::drm::V1_0::ICryptoFactory follow.
+
     Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>& uuid)
             override;
 
@@ -50,27 +51,7 @@
             override;
 
 private:
-    template <typename L> Return<bool> isCryptoSchemeSupported(
-            const L& loader, const hidl_array<uint8_t, 16>& uuid) {
-        for (size_t i = 0; i < loader.factoryCount(); i++) {
-           if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    sp<ICryptoPlugin> createTreblePlugin(const hidl_array<uint8_t, 16>& uuid,
-                    const hidl_vec<uint8_t>& initData);
-
-    sp<ICryptoPlugin> createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid,
-                    const hidl_vec<uint8_t>& initData);
-
-    typedef android::PluginLoader<ICryptoFactory> PluginLoader;
-    PluginLoader trebleLoader;
-
-    typedef android::PluginLoader<android::CryptoFactory> LegacyLoader;
-    LegacyLoader legacyLoader;
+    android::PluginLoader<android::CryptoFactory> loader;
 
     CryptoFactory(const CryptoFactory &) = delete;
     void operator=(const CryptoFactory &) = delete;
diff --git a/drm/1.0/default/DrmFactory.cpp b/drm/1.0/default/DrmFactory.cpp
index c98c1da..92f54f1 100644
--- a/drm/1.0/default/DrmFactory.cpp
+++ b/drm/1.0/default/DrmFactory.cpp
@@ -15,11 +15,10 @@
  */
 #define LOG_TAG "android.hardware.drm@1.0-impl"
 
-#include <utils/Log.h>
-
 #include "DrmFactory.h"
 #include "DrmPlugin.h"
 #include "TypeConvert.h"
+#include <utils/Log.h>
 
 namespace android {
 namespace hardware {
@@ -27,66 +26,56 @@
 namespace V1_0 {
 namespace implementation {
 
-DrmFactory::DrmFactory() :
-    trebleLoader("/vendor/lib/hw", "createDrmFactory"),
-    legacyLoader("/vendor/lib/mediadrm", "createDrmFactory") {
-}
+    DrmFactory::DrmFactory() :
+        loader("/vendor/lib/mediadrm", "createDrmFactory") {
+    }
 
-// Methods from ::android::hardware::drm::V1_0::IDrmFactory follow.
-Return<bool> DrmFactory::isCryptoSchemeSupported(
-        const hidl_array<uint8_t, 16>& uuid) {
-    return isCryptoSchemeSupported(trebleLoader, uuid) ||
-            isCryptoSchemeSupported(legacyLoader, uuid);
-}
+    // Methods from ::android::hardware::drm::V1_0::IDrmFactory follow.
+    Return<bool> DrmFactory::isCryptoSchemeSupported (
+            const hidl_array<uint8_t, 16>& uuid) {
+        for (size_t i = 0; i < loader.factoryCount(); i++) {
+            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
+                return true;
+            }
+        }
+        return false;
+    }
 
-Return<bool> DrmFactory::isContentTypeSupported (
-        const hidl_string& mimeType) {
-    return isContentTypeSupported<PluginLoader, hidl_string>(trebleLoader, mimeType) ||
-            isContentTypeSupported<LegacyLoader, String8>(legacyLoader, mimeType);
-}
+    Return<bool> DrmFactory::isContentTypeSupported (
+            const hidl_string& mimeType) {
+        for (size_t i = 0; i < loader.factoryCount(); i++) {
+            if (loader.getFactory(i)->isContentTypeSupported(String8(mimeType.c_str()))) {
+                return true;
+            }
+        }
+        return false;
+    }
 
     Return<void> DrmFactory::createPlugin(const hidl_array<uint8_t, 16>& uuid,
             const hidl_string& appPackageName, createPlugin_cb _hidl_cb) {
-        sp<IDrmPlugin> plugin = createTreblePlugin(uuid, appPackageName);
-    if (plugin == nullptr) {
-        plugin = createLegacyPlugin(uuid);
-    }
-    _hidl_cb(plugin != nullptr ? Status::OK : Status::ERROR_DRM_CANNOT_HANDLE, plugin);
-    return Void();
-}
 
-sp<IDrmPlugin> DrmFactory::createTreblePlugin(const hidl_array<uint8_t, 16>& uuid,
-        const hidl_string& appPackageName) {
-    sp<IDrmPlugin> plugin;
-    for (size_t i = 0; i < trebleLoader.factoryCount(); i++) {
-        Return<void> hResult = trebleLoader.getFactory(i)->createPlugin(uuid,
-                appPackageName, [&](Status status, const sp<IDrmPlugin>& hPlugin) {
-                    if (status == Status::OK) {
-                        plugin = hPlugin;
-                    }
+        for (size_t i = 0; i < loader.factoryCount(); i++) {
+            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
+                android::DrmPlugin *legacyPlugin = NULL;
+                status_t status = loader.getFactory(i)->createDrmPlugin(
+                        uuid.data(), &legacyPlugin);
+                DrmPlugin *newPlugin = NULL;
+                if (legacyPlugin == NULL) {
+                    ALOGE("Drm legacy HAL: failed to create drm plugin");
+                } else {
+                    newPlugin = new DrmPlugin(legacyPlugin);
                 }
-            );
-        if (plugin != nullptr) {
-            return plugin;
+                _hidl_cb(toStatus(status), newPlugin);
+                return Void();
+            }
         }
+        _hidl_cb(Status::ERROR_DRM_CANNOT_HANDLE, NULL);
+        return Void();
     }
-    return nullptr;
-}
 
-sp<IDrmPlugin> DrmFactory::createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid) {
-    android::DrmPlugin *legacyPlugin = nullptr;
-    for (size_t i = 0; i < legacyLoader.factoryCount(); i++) {
-        legacyLoader.getFactory(i)->createDrmPlugin(uuid.data(), &legacyPlugin);
-        if (legacyPlugin) {
-            return new DrmPlugin(legacyPlugin);
-        }
+    IDrmFactory* HIDL_FETCH_IDrmFactory(const char* /* name */) {
+        return new DrmFactory();
     }
-    return nullptr;
-}
-
-IDrmFactory* HIDL_FETCH_IDrmFactory(const char* /* name */) {
-    return new DrmFactory();
-}
 
 }  // namespace implementation
 }  // namespace V1_0
diff --git a/drm/1.0/default/DrmFactory.h b/drm/1.0/default/DrmFactory.h
index 2e71624..a008844 100644
--- a/drm/1.0/default/DrmFactory.h
+++ b/drm/1.0/default/DrmFactory.h
@@ -42,45 +42,18 @@
     virtual ~DrmFactory() {}
 
     // Methods from ::android::hardware::drm::V1_0::IDrmFactory follow.
+
     Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>& uuid)
             override;
 
-    Return<bool> isContentTypeSupported(const hidl_string& mimeType)
+    Return<bool> isContentTypeSupported(const hidl_string &mimeType)
             override;
 
     Return<void> createPlugin(const hidl_array<uint8_t, 16>& uuid,
             const hidl_string& appPackageName, createPlugin_cb _hidl_cb) override;
 
 private:
-    template <typename L> Return<bool> isCryptoSchemeSupported(
-            const L& loader, const hidl_array<uint8_t, 16>& uuid) {
-        for (size_t i = 0; i < loader.factoryCount(); i++) {
-            if (loader.getFactory(i)->isCryptoSchemeSupported(uuid.data())) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    template <typename L, typename S> Return<bool> isContentTypeSupported(
-            const L& loader, const hidl_string& mimeType) {
-        for (size_t i = 0; i < loader.factoryCount(); i++) {
-            if (loader.getFactory(i)->isContentTypeSupported(S(mimeType))) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    sp<IDrmPlugin> createTreblePlugin(const hidl_array<uint8_t, 16>& uuid,
-        const hidl_string& appPackageName);
-    sp<IDrmPlugin> createLegacyPlugin(const hidl_array<uint8_t, 16>& uuid);
-
-    typedef android::PluginLoader<IDrmFactory> PluginLoader;
-    PluginLoader trebleLoader;
-
-    typedef android::PluginLoader<android::DrmFactory> LegacyLoader;
-    LegacyLoader legacyLoader;
+    android::PluginLoader<android::DrmFactory> loader;
 
     DrmFactory(const DrmFactory &) = delete;
     void operator=(const DrmFactory &) = delete;
diff --git a/example/extension/light/2.0/Android.bp b/example/extension/light/2.0/Android.bp
deleted file mode 100644
index cf345da..0000000
--- a/example/extension/light/2.0/Android.bp
+++ /dev/null
@@ -1,62 +0,0 @@
-// This file is autogenerated by hidl-gen. Do not edit manually.
-
-filegroup {
-    name: "android.hardware.example.extension.light@2.0_hal",
-    srcs: [
-        "types.hal",
-        "IExtLight.hal",
-    ],
-}
-
-genrule {
-    name: "android.hardware.example.extension.light@2.0_genc++",
-    tools: ["hidl-gen"],
-    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.example.extension.light@2.0",
-    srcs: [
-        ":android.hardware.example.extension.light@2.0_hal",
-    ],
-    out: [
-        "android/hardware/example/extension/light/2.0/types.cpp",
-        "android/hardware/example/extension/light/2.0/ExtLightAll.cpp",
-    ],
-}
-
-genrule {
-    name: "android.hardware.example.extension.light@2.0_genc++_headers",
-    tools: ["hidl-gen"],
-    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.example.extension.light@2.0",
-    srcs: [
-        ":android.hardware.example.extension.light@2.0_hal",
-    ],
-    out: [
-        "android/hardware/example/extension/light/2.0/types.h",
-        "android/hardware/example/extension/light/2.0/IExtLight.h",
-        "android/hardware/example/extension/light/2.0/IHwExtLight.h",
-        "android/hardware/example/extension/light/2.0/BnHwExtLight.h",
-        "android/hardware/example/extension/light/2.0/BpHwExtLight.h",
-        "android/hardware/example/extension/light/2.0/BsExtLight.h",
-    ],
-}
-
-cc_library_shared {
-    name: "android.hardware.example.extension.light@2.0",
-    generated_sources: ["android.hardware.example.extension.light@2.0_genc++"],
-    generated_headers: ["android.hardware.example.extension.light@2.0_genc++_headers"],
-    export_generated_headers: ["android.hardware.example.extension.light@2.0_genc++_headers"],
-    shared_libs: [
-        "libhidlbase",
-        "libhidltransport",
-        "libhwbinder",
-        "liblog",
-        "libutils",
-        "libcutils",
-        "android.hardware.light@2.0",
-    ],
-    export_shared_lib_headers: [
-        "libhidlbase",
-        "libhidltransport",
-        "libhwbinder",
-        "libutils",
-        "android.hardware.light@2.0",
-    ],
-}
diff --git a/example/extension/light/2.0/default/Android.mk b/example/extension/light/2.0/default/Android.mk
deleted file mode 100644
index acd9638..0000000
--- a/example/extension/light/2.0/default/Android.mk
+++ /dev/null
@@ -1,19 +0,0 @@
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-LOCAL_MODULE := android.hardware.example.extension.light@2.0-service
-LOCAL_INIT_RC := android.hardware.example.extension.light@2.0-service.rc
-LOCAL_PROPRIETARY_MODULE := true
-LOCAL_MODULE_RELATIVE_PATH := hw
-LOCAL_SRC_FILES := \
-    Light.cpp \
-
-LOCAL_SHARED_LIBRARIES := \
-    libhidlbase \
-    libhidltransport \
-    libhwbinder \
-    libutils \
-    android.hardware.light@2.0 \
-    android.hardware.example.extension.light@2.0 \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc b/example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc
deleted file mode 100644
index 7480a7e..0000000
--- a/example/extension/light/2.0/default/android.hardware.example.extension.light@2.0-service.rc
+++ /dev/null
@@ -1,4 +0,0 @@
-service light-ext-2-0 /vendor/bin/hw/android.hardware.example.extension.light@2.0-service
-    class hal
-    user system
-    group system readproc
\ No newline at end of file
diff --git a/gatekeeper/1.0/vts/functional/Android.bp b/gatekeeper/1.0/vts/functional/Android.bp
index e79e40e..70a85c6 100644
--- a/gatekeeper/1.0/vts/functional/Android.bp
+++ b/gatekeeper/1.0/vts/functional/Android.bp
@@ -31,11 +31,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
diff --git a/graphics/allocator/2.0/vts/functional/Android.bp b/graphics/allocator/2.0/vts/functional/Android.bp
index 194b228..2f58836 100644
--- a/graphics/allocator/2.0/vts/functional/Android.bp
+++ b/graphics/allocator/2.0/vts/functional/Android.bp
@@ -31,11 +31,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage",
-    ],
+    ]
 }
diff --git a/graphics/composer/2.1/vts/functional/Android.bp b/graphics/composer/2.1/vts/functional/Android.bp
index c3f7636..aa2eae3 100644
--- a/graphics/composer/2.1/vts/functional/Android.bp
+++ b/graphics/composer/2.1/vts/functional/Android.bp
@@ -35,11 +35,7 @@
     ],
     static_libs: ["libgtest", "libhwcomposer-command-buffer"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage",
-    ],
+    ]
 }
diff --git a/graphics/mapper/2.0/vts/functional/Android.bp b/graphics/mapper/2.0/vts/functional/Android.bp
index 27ea350..efb868b 100644
--- a/graphics/mapper/2.0/vts/functional/Android.bp
+++ b/graphics/mapper/2.0/vts/functional/Android.bp
@@ -34,11 +34,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage",
-    ],
+    ]
 }
diff --git a/ir/1.0/vts/functional/Android.bp b/ir/1.0/vts/functional/Android.bp
index c5265de..1acd2a0 100644
--- a/ir/1.0/vts/functional/Android.bp
+++ b/ir/1.0/vts/functional/Android.bp
@@ -30,11 +30,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
     ],
-    ldflags: [
-        "--coverage"
-    ]
 }
diff --git a/light/2.0/vts/functional/Android.bp b/light/2.0/vts/functional/Android.bp
index 889457f..53f5d7f 100644
--- a/light/2.0/vts/functional/Android.bp
+++ b/light/2.0/vts/functional/Android.bp
@@ -27,12 +27,8 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
 
diff --git a/media/omx/1.0/IOmxBufferProducer.hal b/media/omx/1.0/IOmxBufferProducer.hal
index d4cf5f7..7e2172b 100644
--- a/media/omx/1.0/IOmxBufferProducer.hal
+++ b/media/omx/1.0/IOmxBufferProducer.hal
@@ -72,12 +72,27 @@
     };
 
     /**
+     * Ref: frameworks/native/include/gui/FrameTimestamp.h: CompositorTiming
+     *
+     * The most recent compositor timing info sent from consumer to producer
+     * through a HIDL interface.
+     */
+    struct CompositorTiming {
+        int64_t deadlineNs;
+        int64_t intervalNs;
+        int64_t presentLatencyNs;
+    };
+
+    /**
      * Ref: frameworks/native/include/gui/FrameTimestamp.h: FrameEventHistoryDelta
      *
      * A collection of updates from consumer to producer that can be sent
      * through a HIDL interface.
      */
-    typedef vec<FrameEventsDelta> FrameEventHistoryDelta;
+    struct FrameEventHistoryDelta {
+        vec<FrameEventsDelta> deltas;
+        CompositorTiming compositorTiming;
+    };
 
     /**
      * Modes for disconnection.
diff --git a/memtrack/1.0/vts/functional/Android.bp b/memtrack/1.0/vts/functional/Android.bp
index b3e560a..0f57adc 100644
--- a/memtrack/1.0/vts/functional/Android.bp
+++ b/memtrack/1.0/vts/functional/Android.bp
@@ -30,11 +30,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
diff --git a/nfc/1.0/vts/functional/Android.bp b/nfc/1.0/vts/functional/Android.bp
index 021f7c1..0f9eb3d 100644
--- a/nfc/1.0/vts/functional/Android.bp
+++ b/nfc/1.0/vts/functional/Android.bp
@@ -31,11 +31,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
     ],
-    ldflags: [
-        "--coverage"
-    ]
 }
diff --git a/power/1.0/vts/functional/Android.bp b/power/1.0/vts/functional/Android.bp
index 81dc316..7aa2611 100644
--- a/power/1.0/vts/functional/Android.bp
+++ b/power/1.0/vts/functional/Android.bp
@@ -31,11 +31,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
diff --git a/renderscript/1.0/Android.bp b/renderscript/1.0/Android.bp
new file mode 100644
index 0000000..5ae7027
--- /dev/null
+++ b/renderscript/1.0/Android.bp
@@ -0,0 +1,175 @@
+// This file is autogenerated by hidl-gen. Do not edit manually.
+
+genrule {
+    name: "android.hardware.renderscript@1.0_genc++",
+    tools: ["hidl-gen"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.renderscript@1.0",
+    srcs: [
+        "types.hal",
+        "IContext.hal",
+        "IDevice.hal",
+    ],
+    out: [
+        "android/hardware/renderscript/1.0/types.cpp",
+        "android/hardware/renderscript/1.0/ContextAll.cpp",
+        "android/hardware/renderscript/1.0/DeviceAll.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.renderscript@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.renderscript@1.0",
+    srcs: [
+        "types.hal",
+        "IContext.hal",
+        "IDevice.hal",
+    ],
+    out: [
+        "android/hardware/renderscript/1.0/types.h",
+        "android/hardware/renderscript/1.0/IContext.h",
+        "android/hardware/renderscript/1.0/IHwContext.h",
+        "android/hardware/renderscript/1.0/BnHwContext.h",
+        "android/hardware/renderscript/1.0/BpHwContext.h",
+        "android/hardware/renderscript/1.0/BsContext.h",
+        "android/hardware/renderscript/1.0/IDevice.h",
+        "android/hardware/renderscript/1.0/IHwDevice.h",
+        "android/hardware/renderscript/1.0/BnHwDevice.h",
+        "android/hardware/renderscript/1.0/BpHwDevice.h",
+        "android/hardware/renderscript/1.0/BsDevice.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.renderscript@1.0",
+    generated_sources: ["android.hardware.renderscript@1.0_genc++"],
+    generated_headers: ["android.hardware.renderscript@1.0_genc++_headers"],
+    export_generated_headers: ["android.hardware.renderscript@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",
+    ],
+}
+
+genrule {
+    name: "android.hardware.renderscript.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.renderscript@1.0 && $(location vtsc) -mDRIVER -tSOURCE -b$(genDir) android/hardware/renderscript/1.0/ $(genDir)/android/hardware/renderscript/1.0/",
+    srcs: [
+        "types.hal",
+        "IContext.hal",
+        "IDevice.hal",
+    ],
+    out: [
+        "android/hardware/renderscript/1.0/types.vts.cpp",
+        "android/hardware/renderscript/1.0/Context.vts.cpp",
+        "android/hardware/renderscript/1.0/Device.vts.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.renderscript.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.renderscript@1.0 && $(location vtsc) -mDRIVER -tHEADER -b$(genDir) android/hardware/renderscript/1.0/ $(genDir)/android/hardware/renderscript/1.0/",
+    srcs: [
+        "types.hal",
+        "IContext.hal",
+        "IDevice.hal",
+    ],
+    out: [
+        "android/hardware/renderscript/1.0/types.vts.h",
+        "android/hardware/renderscript/1.0/Context.vts.h",
+        "android/hardware/renderscript/1.0/Device.vts.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.renderscript.vts.driver@1.0",
+    generated_sources: ["android.hardware.renderscript.vts.driver@1.0_genc++"],
+    generated_headers: ["android.hardware.renderscript.vts.driver@1.0_genc++_headers"],
+    export_generated_headers: ["android.hardware.renderscript.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.renderscript@1.0",
+    ],
+    export_shared_lib_headers: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hidl.base@1.0",
+    ],
+}
+
+genrule {
+    name: "android.hardware.renderscript@1.0-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.renderscript@1.0 && $(location vtsc) -mPROFILER -tSOURCE -b$(genDir) android/hardware/renderscript/1.0/ $(genDir)/android/hardware/renderscript/1.0/",
+    srcs: [
+        "types.hal",
+        "IContext.hal",
+        "IDevice.hal",
+    ],
+    out: [
+        "android/hardware/renderscript/1.0/types.vts.cpp",
+        "android/hardware/renderscript/1.0/Context.vts.cpp",
+        "android/hardware/renderscript/1.0/Device.vts.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.renderscript@1.0-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.renderscript@1.0 && $(location vtsc) -mPROFILER -tHEADER -b$(genDir) android/hardware/renderscript/1.0/ $(genDir)/android/hardware/renderscript/1.0/",
+    srcs: [
+        "types.hal",
+        "IContext.hal",
+        "IDevice.hal",
+    ],
+    out: [
+        "android/hardware/renderscript/1.0/types.vts.h",
+        "android/hardware/renderscript/1.0/Context.vts.h",
+        "android/hardware/renderscript/1.0/Device.vts.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.renderscript@1.0-vts.profiler",
+    generated_sources: ["android.hardware.renderscript@1.0-vts.profiler_genc++"],
+    generated_headers: ["android.hardware.renderscript@1.0-vts.profiler_genc++_headers"],
+    export_generated_headers: ["android.hardware.renderscript@1.0-vts.profiler_genc++_headers"],
+    shared_libs: [
+        "libbase",
+        "libhidlbase",
+        "libhidltransport",
+        "libvts_profiling",
+        "libvts_multidevice_proto",
+        "libprotobuf-cpp-full",
+        "android.hidl.base@1.0",
+        "android.hardware.renderscript@1.0",
+    ],
+}
diff --git a/renderscript/1.0/Android.mk b/renderscript/1.0/Android.mk
new file mode 100644
index 0000000..3a7babd
--- /dev/null
+++ b/renderscript/1.0/Android.mk
@@ -0,0 +1,41 @@
+# This file is autogenerated by hidl-gen. Do not edit manually.
+
+LOCAL_PATH := $(call my-dir)
+
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.renderscript@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/renderscript/V1_0/Constants.java
+$(GEN): $(HIDL)
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/IContext.hal
+$(GEN): $(LOCAL_PATH)/IDevice.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.renderscript@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/renderscript/1.0/IContext.hal b/renderscript/1.0/IContext.hal
new file mode 100644
index 0000000..2e386d2
--- /dev/null
+++ b/renderscript/1.0/IContext.hal
@@ -0,0 +1,1177 @@
+/*
+ * 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.
+ */
+
+package android.hardware.renderscript@1.0;
+
+import android.hardware.renderscript@1.0::types;
+
+// TODO: is there any way to keep this documentation in sync with the
+// corresponding Java doc?
+//
+// TODO: Some of the documentation was taken from Java docs, whereas others were
+// undocumented. Because of this, there's somewhat two different styles of
+// comments. Look into having a consistent convention.
+//
+// TODO: There was some confusion as to why some paramters use vec<> and others
+// use Ptr/Size. The convention is that vec<> is used whenever the paramter is
+// only an input parameter. HIDL is not supposed to include any output
+// parameters, so a more explicit Ptr/Size is used.
+
+interface IContext {
+
+    /*
+     * TODO: Do we need to define "selectors"? It may be a property of the
+     * "adapted allocation" that's returned.
+     *
+     * Creates an arbitrary window into the base allocation. The type describes
+     * the shape of the window. Any dimensions present in the type must be
+     * equal to or smaller than the dimensions in the source allocation. A
+     * dimension present in the allocation that is not present in the type must
+     * be constrained away with the selectors. If a dimension is present in
+     * both the type and allocation, one of two things must happen. If the type
+     * is smaller than the allocation, a window must be created, the selected
+     * value in the adapter for that dimension must act as the base address,
+     * and the type must describe the size of the view starting at that point.
+     * If the type and allocation dimension are of the same size, then setting
+     * the selector for the dimension must be an error.
+     *
+     * @param type Type describing data layout
+     * @param baseAlloc Allocation
+     * @return subAlloc AllocationAdapter
+     */
+    @callflow(next={"*"})
+    allocationAdapterCreate(Type type, Allocation baseAlloc)
+                 generates (AllocationAdapter subAlloc);
+
+    /*
+     * TODO: Need to relate "offset" back to the terminology in
+     * allocationAdapterCreate() -- the latter uses the terms "selector" and
+     * "selected value". Can we use consistent terminology? Are "offset" and
+     * "selector" actually two different things?
+     *
+     * TODO: Explain the flattened layout in the offsets vec
+     *
+     * Sets the offsets for an Allocation Adapter.
+     *
+     * @param alloc AllocationAdapter
+     * @param offsets Collection of offsets
+     */
+    @callflow(next={"*"})
+    allocationAdapterOffset(AllocationAdapter alloc, vec<uint32_t> offsets);
+
+    /*
+     * TODO: add more explanation here.
+     *
+     * Returns the Type of the Allocation.
+     *
+     * @param allocation Allocation
+     * @return type Allocation's Type
+     */
+    @callflow(next={"*"})
+    allocationGetType(Allocation allocation) generates (Type type);
+
+    /*
+     * TODO: more clarification needed describing if the pointer can be aliased
+     * or if the data can outlive the allocation.
+     *
+     * Creates an Allocation for use by scripts with a given Type and a backing
+     * pointer. For use with ALLOCATION_USAGE_SHARED.
+     *
+     * @param type Type describing data layout
+     * @param mips AllocationMipmapControl specifies desired mipmap behavior for
+     *             the allocation
+     * @param usage Bit field specifying how the Allocation is utilized
+     * @param ptr Pointer to client-side data
+     * @return allocation Created Allocation
+     */
+    @callflow(next={"*"})
+    allocationCreateTyped(Type type, AllocationMipmapControl mips,
+                          bitfield<AllocationUsageType> usage, Ptr ptr)
+               generates (Allocation allocation);
+
+    /*
+     * Creates an Allocation from a Bitmap.
+     *
+     * @param type Type describing data layout
+     * @param mips AllocationMipmapControl specifies desired mipmap behavior for
+     *             the allocation
+     * @param bitmap Bitmap source for the allocation data
+     * @param usage Bit field specifying how the Allocation is utilized
+     * @return allocation Created Allocation containing bitmap data
+     */
+    @callflow(next={"*"})
+    allocationCreateFromBitmap(Type type, AllocationMipmapControl mips,
+                               vec<uint8_t> bitmap,
+                               bitfield<AllocationUsageType> usage)
+                    generates (Allocation allocation);
+
+    /*
+     * Creates a Cubemapped Allocation from a Bitmap.
+     *
+     * @param type Type describing data layout
+     * @param mips AllocationMipmapControl specifies desired mipmap behavior
+     *             for the allocation
+     * @param bitmap Bitmap with cubemap faces layed out in the following
+     *               format: right, left, top, bottom, front, back
+     * @param usage Bit field specifying how the Allocation is used
+     * @return allocation Created Allocation containing cubemap data
+     */
+    @callflow(next={"*"})
+    allocationCubeCreateFromBitmap(Type type, AllocationMipmapControl mips,
+                                   vec<uint8_t> bitmap,
+                                   bitfield<AllocationUsageType> usage)
+                        generates (Allocation allocation);
+
+    /*
+     * Returns the handle to a raw buffer that is being managed by the screen
+     * compositor. This operation is only valid for Allocations with
+     * USAGE_IO_INPUT.
+     *
+     * @param allocation Allocation
+     * @return nativeWindow NativeWindow object associated with allocation
+     */
+    @callflow(next={"*"})
+    allocationGetNativeWindow(Allocation allocation)
+                   generates (NativeWindow nativeWindow);
+
+    /*
+     * TODO: more clarification needed
+     *
+     * Sets the NativeWindow of an Allocation. This operation is only valid
+     * for Allocations with USAGE_IO_INPUT.
+     *
+     * @param allocation Allocation to be modified
+     * @pram nativeWindow NativeWindow to associate with allocation
+     */
+    @callflow(next={"*"})
+    allocationSetNativeWindow(Allocation allocation, NativeWindow nativewindow);
+
+    /*
+     * Initialize BufferQueue with specified max number of buffers.
+     *
+     * @param alloc Allocation
+     * @param numBuffer Maximum number of buffers
+     */
+    @callflow(next={"*"})
+    allocationSetupBufferQueue(Allocation alloc, uint32_t numBuffer);
+
+    /*
+     * TODO: clearly define baseAlloc vs subAlloc
+     *
+     * Shares the BufferQueue with another Allocation. Both must be
+     * USAGE_IO_INPUT Allocations.
+     *
+     * @param baseAlloc Base Allocation
+     * @param subAlloc Allocation to use the same buffer queue as the Base
+     *                 Allocation
+     */
+    @callflow(next={"*"})
+    allocationShareBufferQueue(Allocation baseAlloc, Allocation subAlloc);
+
+    /*
+     * Copies from the Allocation into a Bitmap. The bitmap must match the
+     * dimensions of the Allocation.
+     *
+     * HIDL is always running in Passthrough mode for RenderScript, so the
+     * buffer is modified directly by the driver.
+     *
+     * @param allocation Allocation
+     * @param data Buffer to be copied into
+     * @param sizeBytes Size of the buffer pointed to by "data"
+     */
+    @callflow(next={"*"})
+    allocationCopyToBitmap(Allocation allocation, Ptr data, Size sizeBytes);
+
+    /*
+     * TODO: should we consolidate all [123]DWrite functions or [123]DRead
+     * functions into the same API call? Our current plan is to be very similar
+     * to the dispatch table API. How much should we deviate from the original
+     * API?
+     * TODO: better description on Vec3/Vec4 and padding.
+     *
+     * Copies data into a 1D region of this Allocation.
+     *
+     * When this HAL entry is executed, all Vec3 elements have been explicitly
+     * padded as Vec4 elements.
+     *
+     * The size of the region is: count * Element's size.
+     *
+     * @param allocation Allocation to be modified
+     * @param offset The offset of the first element to be copied
+     * @param lod Selected mipmap level of detail
+     * @param count Number of elements to be copied
+     * @param data Source data to be copied to Allocation
+     */
+    @callflow(next={"*"})
+    allocation1DWrite(Allocation allocation, uint32_t offset, uint32_t lod,
+                      uint32_t count, vec<uint8_t> data);
+
+    /*
+     * Copies a value into a single sub-Element of this Allocation.
+     *
+     * @param allocation Allocation to be updated
+     * @param x X position of the first element in the Allocation to be updated
+     * @param y Y position of the first element in the Allocation to be
+     *          updated; for a 1D Allocation, this value must be 0
+     * @param z Z position of the first element in the Allocation to be
+     *          updated; for a 1D or 2D Allocation, this value must be 0
+     * @param lod Selected mipmap level of detail
+     * @param data Data to be copied from
+     * @param compIdx Component number to identify which sub-Element is updated
+     */
+    @callflow(next={"*"})
+    allocationElementWrite(Allocation allocation, uint32_t x, uint32_t y,
+                           uint32_t z, uint32_t lod, vec<uint8_t> data,
+                           Size compIdx);
+
+    /*
+     * Copies from an array into a rectangular region in this Allocation.
+     *
+     * When this HAL entry is executed, all Vec3 elements have been explicitly
+     * padded as Vec4 elements.
+     *
+     * The size of the region is: w * h * Element's size.
+     *
+     * @param allocation Allocation to be modified
+     * @param xoff X offset of the region to update in this Allocation
+     * @param yoff Y offset of the region to update in this Allocation
+     * @param lod Selected mipmap level of detail
+     * @param face AllocationCubemapFace
+     * @param w Width of the region to update
+     * @param h Height of the region to update
+     * @param data Data to be placed into the Allocation
+     * @param stride For 1D Allocation, the stride must be the number of bytes
+     *               of this Allocation. For 2D and 3D Allocations, the stride
+     *               must be the stride in X dimension measuring in bytes.
+     */
+    @callflow(next={"*"})
+    allocation2DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff,
+                      uint32_t lod, AllocationCubemapFace face, uint32_t w,
+                      uint32_t h, vec<uint8_t> data, Size stride);
+
+    /*
+     * Copies from an array into a 3D region in this Allocation.
+     *
+     * When this HAL entry is executed, all Vec3 elements have been explicitly
+     * padded as Vec4 elements.
+     *
+     * The size of the region is: w * h * d * Element's size.
+     *
+     * @param allocation Allocation to be modified
+     * @param xoff X offset of the region to update in this Allocation
+     * @param yoff Y offset of the region to update in this Allocation
+     * @param zoff Z offset of the region to update in this Allocation
+     * @param lod Selected mipmap level of detail
+     * @param w Width of the region to update
+     * @param h Height of the region to update
+     * @param d Depth of the region to update
+     * @param data Data to be placed in the Allocation
+     * @param stride For 1D Allocation, the stride must be the number of bytes
+     *               of this Allocation. For 2D and 3D Allocations, the stride
+     *               must be the stride in X dimension measuring in bytes.
+     */
+    @callflow(next={"*"})
+    allocation3DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff,
+                      uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h,
+                      uint32_t d, vec<uint8_t> data, Size stride);
+
+    /*
+     * Generates a mipmap chain. This is only valid if the Type of the
+     * Allocation includes mipmaps.
+     *
+     * This function generates a complete set of mipmaps from the top level
+     * LOD.
+     *
+     * If the Allocation is also using other memory spaces, a call to
+     * allocationSyncAll(context, allocation, usage) is required.
+     *
+     * @param allocation Allocation which has its top LOD read and lower LOD
+     *                   written to
+     */
+    @callflow(next={"*"})
+    allocationGenerateMipmaps(Allocation allocation);
+
+    /*
+     * Copies all of an Allocation's data into an array.
+     *
+     * All Vec3 elements of an Allocation are padded to be Vec4, so the data
+     * returned by this function automatically includes padding.
+     *
+     * HIDL is always running in Passthrough mode for RenderScript, so the
+     * buffer is modified directly by the driver.
+     *
+     * @param allocation Allocation to be read
+     * @param data Buffer to be copied into
+     * @param sizeBytes Size of the buffer pointed to by "data"
+     */
+    @callflow(next={"*"})
+    allocationRead(Allocation allocation, Ptr data, Size sizeBytes);
+
+    /*
+     * Copies a 1D region of this Allocation into an array.
+     *
+     * All Vec3 elements of an Allocation are padded to be Vec4, so the data
+     * returned by this function automatically includes padding.
+     *
+     * The size of the region is: count * Element's size.
+     *
+     * HIDL is always running in Passthrough mode for RenderScript, so the
+     * buffer is modified directly by the driver.
+     *
+     * @param allocation Allocation to be read
+     * @param xoff X offset of the first element to be copied
+     * @param lod Mipmap level of detail
+     * @param count The number of elements to be copied
+     * @param data Buffer to be copied into
+     * @param sizeBytes Size of the buffer pointed to by "data"
+     */
+    @callflow(next={"*"})
+    allocation1DRead(Allocation allocation, uint32_t xoff, uint32_t lod,
+                     uint32_t count, Ptr data, Size sizeBytes);
+
+    /*
+     * Returns the value of a single sub-Element of this Allocation.
+     *
+     * HIDL is always running in Passthrough mode for RenderScript, so the
+     * buffer is modified directly by the driver.
+     *
+     * @param allocation Allocation to be read
+     * @param x X position of the first element in the Allocation to be read
+     * @param y Y position of the first element in the Allocation to be read
+     * @param z Z position of the first element in the Allocation to be read
+     * @param lod Mipmap level of detail
+     * @param data Buffer to be copied into
+     * @param sizeBytes Size of the buffer pointed to by "data"
+     * @param compIdx Component number to identify which sub-Element is updated
+     */
+    @callflow(next={"*"})
+    allocationElementRead(Allocation allocation, uint32_t x, uint32_t y,
+                          uint32_t z, uint32_t lod, Ptr data, Size sizeBytes,
+                          Size compIdx);
+
+    /*
+     * Copies from a rectangular region in this Allocation to an array.
+     *
+     * All Vec3 elements of an Allocation are padded to be Vec4, so the data
+     * returned by this function automatically includes padding.
+     *
+     * The size of the region is: w * h * Element's size.
+     *
+     * HIDL is always running in Passthrough mode for RenderScript, so the
+     * buffer is modified directly by the driver.
+     *
+     * @param allocation Allocation to be read
+     * @param xoff X offset of the region to copy in this array
+     * @param yoff Y offset of the region to copy in this array
+     * @param lod Mipmap level of detail
+     * @param face AllocationCubemapFace
+     * @param w Width of the region to copy
+     * @param h Height of the region to copy
+     * @param data Buffer to be copied into
+     * @param sizeBytes Size of the buffer pointed to by "data"
+     * @param stride For 1D Allocation, the stride must be the number of bytes
+     *               of this Allocation. For 2D and 3D Allocations, the stride
+     *               must be the stride in X dimension measuring in bytes.
+     */
+    @callflow(next={"*"})
+    allocation2DRead(Allocation allocation, uint32_t xoff, uint32_t yoff,
+                     uint32_t lod, AllocationCubemapFace face, uint32_t w,
+                     uint32_t h, Ptr data, Size sizeBytes, Size stride);
+
+    /*
+     * Copies from a rectangular cuboid region in this Allocation to an array.
+     *
+     * All Vec3 elements of an Allocation are padded to be Vec4, so the data
+     * returned by this function automatically includes padding.
+     *
+     * The size of the region is: w * h * d * Element's size.
+     *
+     * HIDL is always running in Passthrough mode for RenderScript, so the
+     * buffer is modified directly by the driver.
+     *
+     * @param allocation Allocation to be read
+     * @param xoff X offset of the region to copy in this array
+     * @param yoff Y offset of the region to copy in this array
+     * @param zoff Z offset of the region to copy in this array
+     * @param lod Mipmap level of detail
+     * @param w Width of the region to copy
+     * @param h Height of the region to copy
+     * @param d Depth of the region to copy
+     * @param data Buffer to be copied into
+     * @param sizeBytes Size of the buffer pointed to by "data"
+     * @param stride For 1D Allocation, the stride must be the number of bytes
+     *               of this Allocation. For 2D and 3D Allocations, the stride
+     *               must be the stride in X dimension measuring in bytes.
+     */
+    @callflow(next={"*"})
+    allocation3DRead(Allocation allocation, uint32_t xoff, uint32_t yoff,
+                     uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h,
+                     uint32_t d, Ptr data, Size sizeBytes, Size stride);
+
+    /*
+     * Propagates changes from one usage of the Allocation to the other usages
+     * of the Allocation.
+     *
+     * @param allocation First usage of the Allocation
+     * @param usageType Allocation usage type
+     */
+    @callflow(next={"*"})
+    allocationSyncAll(Allocation allocation, AllocationUsageType usageType);
+
+    /*
+     * TODO: describe the functionality of resize1D better
+     * TODO: original Java Doc description seems to contradict itself ("with
+     * null contents and the region is otherwise undefined")
+     * TODO: should "new elements" be "new cells"?
+     * TODO: what does "objects are created" mean?
+     * TODO: what does "new dimension" mean? IS the type of the resized
+     * allocation different than the type before resizing?
+     *
+     * Resizes a 1D allocation. The contents of the allocation are preserved.
+     * If new elements are allocated, objects are created with null contents
+     * and the new region is otherwise undefined.
+     *
+     * If the new region is smaller, the references of any object outside the
+     * new region must be released.
+     *
+     * A new type must be created with the new dimension.
+     *
+     * @param allocation Allocation to be resized
+     * @param dimX New size along the x dimension of the Allocation
+     */
+    @callflow(next={"*"})
+    allocationResize1D(Allocation allocation, uint32_t dimX);
+
+    /*
+     * TODO: There are allocationCopy2DRange and 3DRange, but no 1DRange. Should
+     * the interface be cleaned up more?
+     *
+     * Copies a rectangular region from an Allocation into a rectangular region
+     * in this Allocation.
+     *
+     * @param dstAlloc Allocation to be updated
+     * @param dstXoff X offset of the region to update
+     * @param dstYoff Y offset of the region to update
+     * @param dstMip Selected mipmap level of the Allocation to update
+     * @param dstFace Destination AllocationCubemapFace
+     * @param width Width of the region to update
+     * @param height Height of the region to update
+     * @param srcAlloc Source Allocation, to be read
+     * @param srcXoff X offset of the region in the source Allocation
+     * @param srcYoff Y offset of the region in the source Allocation
+     * @param srcMip Selected mipmap level of the source Allocation
+     * @param srcFace Source AllocationCubemapFace
+     */
+    @callflow(next={"*"})
+    allocationCopy2DRange(Allocation dstAlloc, uint32_t dstXoff,
+                          uint32_t dstYoff, uint32_t dstMip,
+                          AllocationCubemapFace dstFace, uint32_t width,
+                          uint32_t height, Allocation srcAlloc,
+                          uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip,
+                          AllocationCubemapFace srcFace);
+
+    /*
+     * Copies a rectangular cuboid region into the allocation from another
+     * Allocation.
+     *
+     * @param dstAlloc Allocation to be updated
+     * @param dstXoff X offset of the region to update
+     * @param dstYoff Y offset of the region to update
+     * @param dstZoff Z offset of the region to update
+     * @param dstMip Selected mipmap level of the Allocation to update
+     * @param width Width of the region to update
+     * @param height Height of the region to update
+     * @param depth Depth of the region to update
+     * @param srcAlloc Source Allocation, to be read
+     * @param srcXoff Source X offset of the region in the source Allocation
+     * @param srcYoff Source Y offset of the region in the source Allocation
+     * @param srcZoff Source Z offset of the region in the souce Allocation
+     * @param srcMip Selected mipmap level of the Allocation to read
+     */
+    @callflow(next={"*"})
+    allocationCopy3DRange(Allocation dstAlloc, uint32_t dstXoff,
+                          uint32_t dstYoff, uint32_t dstZoff, uint32_t dstMip,
+                          uint32_t width, uint32_t height, uint32_t depth,
+                          Allocation srcAlloc, uint32_t srcXoff,
+                          uint32_t srcYoff, uint32_t srcZoff, uint32_t srcMip);
+
+    /*
+     * TODO: define buffer and output stream
+     *
+     * Sends a buffer to the output stream. The contents of the Allocation may
+     * be undefined after this operation. This operation is only valid if
+     * USAGE_IO_OUTPUT is set on the Allocation.
+     *
+     * @param allocation Allocation to be sent
+     */
+    @callflow(next={"*"})
+    allocationIoSend(Allocation allocation);
+
+    /*
+     * Receives the latest input into the Allocation. This operation is only
+     * valid if USAGE_IO_INPUT is set on the Allocation, otherwise an error
+     * must be reported and no operations may be executed.
+     *
+     * @param allocation Allocation to be updated
+     */
+    @callflow(next={"*"})
+    allocationIoReceive(Allocation allocation);
+
+    /*
+     * TODO: describe default values for lod, face, and z better.
+     * TODO: what cases can invalidate the pointer? Resize? It should be
+     * clarified that this method should always return a valid pointer, but the
+     * returned pointer might become invalid later.
+     *
+     * Retrieves the pointer to the actual data an Allocation contains as well
+     * as the data's stride.
+     *
+     * If Allocation lacks the corresponding dimension for lod, face, or z, an
+     * error message must be sent to the message queue and nullptr must be
+     * returned for dataPtr and 0 for stride. All missing values must be 0 or
+     * NONE in the corresponding enum.
+     *
+     * @param allocation Allocation
+     * @param lod Mipmap level of detail
+     * @param face AllocationCubemapFace
+     * @param z Z position
+     * @return pointer Pointer to the server-side data; if this points to an
+     *                 invalid location in memory (because the buffer was
+     *                 freed), this may result in undefined behavior
+     * @return stride For 1D Allocation, the stride must be the number of bytes
+     *                of this Allocation. For 2D and 3D Allocations, the stride
+     *                must be the stride in X dimension measuring in bytes.
+     */
+    @callflow(next={"*"})
+    allocationGetPointer(Allocation allocation, uint32_t lod,
+                         AllocationCubemapFace face, uint32_t z)
+              generates (Ptr dataPtr, Size stride);
+
+    /*
+     * Retrieves an Element's metadata from native code.
+     *
+     * @param element Element to be read
+     * @return elemData Element data
+     */
+    @callflow(next={"*"})
+    elementGetNativeMetadata(Element element)
+                  generates (vec<uint32_t> elemData);
+
+    /*
+     * TODO: define Sub-Element handles better.
+     *
+     * Retrieves an Element's sub Elements, specifically their identifiers,
+     * names, and sizes.
+     *
+     * @param element Element to be read
+     * @param numSubElem Number of sub-Elements
+     * @return ids Sub-Element handles
+     * @return names Sub-Element Names
+     * @return arraySizes Sizes of sub-Element arrays
+     */
+    @callflow(next={"*"})
+    elementGetSubElements(Element element, Size numSubElem)
+               generates (vec<Element> ids, vec<string> names,
+                          vec<Size> arraySizes);
+
+    /*
+     * TODO: can normalization flag be removed?
+     *
+     * Creates an Element.
+     *
+     * @param dt Data type
+     * @param dk Data kind
+     * @param norm Flag for normalization
+     * @param size Vector length, with scalar = 1
+     * @return element Created Element
+     */
+    @callflow(next={"*"})
+    elementCreate(DataType dt, DataKind dk, bool norm, uint32_t size)
+       generates (Element element);
+
+    /*
+     * Creates a complex Element.
+     *
+     * @param einsPtr Container of input Elements
+     * @param namesPtr Container of input names
+     * @param arraySizesPtr Container of array sizes
+     * @return element Created Element
+     */
+    @callflow(next={"*"})
+    elementComplexCreate(vec<Element> einsPtr, vec<string> names,
+                         vec<Size> arraySizesPtr)
+              generates (Element element);
+
+    /*
+     * Retrives a Type's metadata from native code.
+     *
+     * @param type Type describing data layout
+     * @return metadata Type's native metadata
+     */
+    @callflow(next={"*"})
+    typeGetNativeMetadata(Type type) generates (vec<OpaqueHandle> metadata);
+
+    /*
+     * Creates a new Type.
+     *
+     * If Type is 1D, Y and Z must be 0. If Type is 2D, Z must be 0.
+     *
+     * @param element Element of the Type
+     * @param dimX X dimension
+     * @param dimY Y dimension
+     * @param dimZ Z dimension
+     * @param mipmaps Flag indicating whether Type has mipmaps
+     * @param faces Flag indicating whether Type has faces
+     * @param yuv Enumeration specifying which type of YUV format, if any, Type
+     *            uses
+     * @return type Created Type
+     */
+    @callflow(next={"*"})
+    typeCreate(Element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ,
+               bool mipmaps, bool faces, YuvFormat yuv)
+    generates (Type type);
+
+    /*
+     * Destroys provided RenderScript context, including all objects created in
+     * this context.
+     */
+    @exit
+    contextDestroy();
+
+    /*
+     * TODO: provide overview of messaging model and figure out if this should
+     * be part of HAL or not.
+     * TODO: what is the "client" for purposes of this interface?
+     * TODO: consider using send/receive to be more similar to other calls
+     * TODO: define the purpose of size more
+     *
+     * Fills the provided buffer with message data. "size" should be at least
+     * as large as the message size. Returns the MessageType and size of the
+     * message are returned.
+     *
+     * @param data A pointer to a buffer to be filled with a message
+     * @param size Size in bytes of the buffer pointed to by "data"
+     * @return messageType Type of message sent to the client
+     * @return receiveLen Length of the message in bytes
+     */
+    @callflow(next={"*"})
+    contextGetMessage(Ptr data, Size size)
+           generates (MessageToClientType messageType, Size receiveLen);
+
+    /*
+     * TODO: define subID better.
+     *
+     * Gets the metadata of a message to ensure entire message can be properly
+     * received. Can be used to determine size of data to allocate when calling
+     * contextGetMessage.
+     *
+     * @return messageType Type of message sent to the client
+     * @return receiveLen Length of message
+     * @return subID Message sub identifier
+     */
+    @callflow(next={"*"})
+    contextPeekMessage()
+            generates (MessageToClientType messageType, Size receiveLen,
+                       uint32_t subID);
+
+    /*
+     * TODO: Define "previous commands" better
+     * TODO: Is the message identifier the same as subID?
+     *
+     * Places a message into the message queue to be sent back to the message
+     * handler once all previous commands have been executed. The message data
+     * is copied into the queue and can be discarded by the client after this
+     * call.
+     *
+     * @param id Message identifier
+     * @param data Message data
+     */
+    @callflow(next={"*"})
+    contextSendMessage(uint32_t id, vec<uint8_t> data);
+
+    /*
+     * TODO: Can this be done automatically as part of context creation? What
+     * happens if we perform message operations before doing this?
+     *
+     * Initializes the messaging thread, so that the front-end API can receive
+     * messages from the driver. This call also waits for the messaging FIFO to
+     * start up.
+     */
+    @callflow(next={"*"})
+    contextInitToClient();
+
+    /*
+     * TODO: Why doesn't this happen automatically as part of context
+     * destruction? What happens if the FIFO is not empty?
+     *
+     * Deinitializes a the messaging thread. Shuts down the FIFO.
+     */
+    @callflow(next={"*"})
+    contextDeinitToClient();
+
+    /*
+     * TODO: do we need to mark asynchronous operations in this interface
+     * definition?
+     *
+     * Waits for any pending asynchronous operations (such as copies to a RS
+     * allocation or RS script executions) to complete.
+     */
+    @callflow(next={"*"})
+    contextFinish();
+
+    /*
+     * Prints the currently available debugging information about the state of
+     * the RS context to the logcat.
+     */
+    @callflow(next={"*"})
+    contextLog();
+
+    /*
+     * TODO: full path? relative path? Investigate further.
+     *
+     * Sets the cache directory of the context.
+     *
+     * @param cacheDir Name of the application's cache directory
+     */
+    @callflow(next={"*"})
+    contextSetCacheDir(string cacheDir);
+
+    /*
+     * TODO: does this apply to the GPU as well?
+     *
+     * Changes the priority of the cpu worker threads for this context.
+     *
+     * @param priority Priority of the thread
+     */
+    @callflow(next={"*"})
+    contextSetPriority(ThreadPriorities priority);
+
+    /*
+     * TODO: does this need to be part of the HAL? What if the object already
+     * has a name?
+     *
+     * Assigns a name to a base object.
+     *
+     * @param obj Object to be named
+     * @param name Assigned name
+     */
+    @callflow(next={"*"})
+    assignName(ObjectBase obj, string name);
+
+    /*
+     * TODO: what if the object has no name?
+     *
+     * Returns the name of an object.
+     *
+     * @param obj Object to be read
+     * @return name Name of the object
+     */
+    @callflow(next={"*"})
+    getName(ObjectBase obj) generates (string name);
+
+    /*
+     * TODO: starting here we have a set of interfaces for use with
+     * ScriptGroups. At the very least we should indicate for each one that's
+     * what it's for. Should we include ScriptGroup in the interface names?
+     * TODO: sweep whole file and remove prefix "v" from all parameter names
+     * TODO: there are some places where we use Size for size, and others where
+     * we use int32_t. Is there a reason it's int32_t? In some cases, it
+     * requires a negative value.
+     *
+     * Creates a Closure which represents a function call to a ForEach Kernel
+     * combined with arguments and values for global variables.
+     *
+     * @param kernelID Kernel identifier
+     * @param returnValue Allocation used in output of Closure
+     * @param fieldIDS Collection of Script's Field identifiers
+     * @param values Collection of Script's data values
+     * @param sizes Collection of Script's data sizes
+     * @param depClosures Collection of Closures
+     * @param depFieldIDS Collection of Script's dependent Field identifiers
+     * @return closure Created Closure
+     */
+    @callflow(next={"*"})
+    closureCreate(ScriptKernelID kernelID, Allocation returnValue,
+                  vec<ScriptFieldID> fieldIDS, vec<int64_t> values,
+                  vec<int32_t> sizes, vec<Closure> depClosures,
+                  vec<ScriptFieldID> depFieldIDS)
+       generates (Closure closure);
+
+    /*
+     * Creates a Closure which represents a function call to a invocable
+     * function, combined with arguments and values for global variables.
+     *
+     * @param invokeID Invokable function identifier
+     * @param params Collection of Invoke script parameters
+     * @param fieldIDS Collection of Script Field identifiers
+     * @param values Collection of values
+     * @param sizes Collection of sizes
+     * @return closure Created Closure
+     */
+    @callflow(next={"*"})
+    invokeClosureCreate(ScriptInvokeID invokeID, vec<uint8_t> params,
+                        vec<ScriptFieldID> fieldIDS, vec<int64_t> values,
+                        vec<int32_t> sizes)
+             generates (Closure closure);
+
+    /*
+     * Sets the argument of a Closure at specified index and size to provided
+     * value.
+     *
+     * @param closure Closure to be modified
+     * @param index Index
+     * @param value Value
+     * @param size Size
+     */
+    @callflow(next={"*"})
+    closureSetArg(Closure closure, uint32_t index, Ptr value, int32_t size);
+
+    /*
+     * Sets a global variable in a Closure.
+     *
+     * @param closure Closure
+     * @param fieldID Global's Field identifier
+     * @param value Value
+     * @param size Size
+     */
+    @callflow(next={"*"})
+    closureSetGlobal(Closure closure, ScriptFieldID fieldID, int64_t value,
+                     int32_t size);
+
+    /*
+     * TODO: should slot be unsigned? (applies to other two ID interfaces, too)
+     *
+     * Creates a Script Kernel ID.
+     *
+     * @param script Script
+     * @param slot Slot
+     * @param sig Bitfield describing Kernel signature and operation
+     * @return scriptKernelID Script's Kernel identifier
+     */
+    @callflow(next={"*"})
+    scriptKernelIDCreate(Script script, int32_t slot,
+                         bitfield<MetadataSignatureBitval> sig)
+              generates (ScriptKernelID scriptKernelID);
+
+    /*
+     * Creates a Script Invoke ID.
+     *
+     * @param script Script
+     * @param slot Slot
+     * @return scriptInvokeID Invoke Script's identifier
+     */
+    @callflow(next={"*"})
+    scriptInvokeIDCreate(Script script, int32_t slot)
+              generates (ScriptInvokeID scriptInvokeID);
+
+    /*
+     * TODO: describe the return value better. What is it?
+     *
+     * Creates a Script Field ID.
+     *
+     * @param script Script
+     * @param slot Slot
+     * @return scriptFieldID Script's Field identifier
+     */
+    @callflow(next={"*"})
+    scriptFieldIDCreate(Script script, int32_t slot)
+             generates (ScriptFieldID scriptFieldID);
+
+    /*
+     * TODO: add more description
+     *
+     * Creates a Script Group.
+     *
+     * @param kernels Collection of Scripts' Kernel identifiers
+     * @param srcK Source Kernel identifiers
+     * @param dstK Destination Kernel identifiers
+     * @param dstF Destination Script Field identifiers
+     * @param types Collection of Types describing data layout
+     * @return scriptGroup Created Script Group
+     */
+    @callflow(next={"*"})
+    scriptGroupCreate(vec<ScriptKernelID> kernels, vec<ScriptKernelID> srcK,
+                      vec<ScriptKernelID> dstK, vec<ScriptFieldID> dstF,
+                      vec<Type> types)
+           generates (ScriptGroup scriptGroup);
+
+    /*
+     * Creates a Script Group.
+     *
+     * @param name Name
+     * @param cacheDir Cache directory
+     * @param closures Collection of Closures
+     * @return scriptGroup2 Created Script Group
+     */
+    @callflow(next={"*"})
+    scriptGroup2Create(string name, string cacheDir, vec<Closure> closures)
+            generates (ScriptGroup2 scriptGroup2);
+
+    /*
+     * TODO: if SetInput/Output corresponds to the Java API setInput() and
+     * setOutput(), which are documented as deprecated in API 23, do we need to
+     * support them? Or can we fallback to the CPU when they're used? Or can't
+     * we tell whether they're used early enough to do fallback?
+     *
+     * Sets an output of the ScriptGroup. This specifies an Allocation to be
+     * used for the kernels that require an output Allocation visible after the
+     * ScriptGroup is executed.
+     *
+     * @param sg Script Group
+     * @param kid Script's Kernel identifier to be changed
+     * @param alloc Allocation to be filled by output
+     */
+    @callflow(next={"*"})
+    scriptGroupSetOutput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc);
+
+    /*
+     * Sets an input of the Script Group. This specifies an Allocation to be
+     * used for kernels that require an input Allocation provided from outside
+     * of the Script Group.
+     *
+     * @param sg Script Group
+     * @param kid Script's Kernel identifier to be changed
+     * @param alloc Allocation to be read as input
+     */
+    @callflow(next={"*"})
+    scriptGroupSetInput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc);
+
+    /*
+     * Executes a Script Group.
+     *
+     * @param sg Script Group to be executed.
+     */
+    @callflow(next={"*"})
+    scriptGroupExecute( ScriptGroup sg);
+
+    /*
+     * Frees any native resources associated with this object. The primary use
+     * is to force immediate cleanup of resources when it is believed the GC
+     * may not respond quickly enough.
+     *
+     * @param handle Opaque handle to the server-side object to be destroyed
+     */
+    @callflow(next={"*"})
+    objDestroy(ObjectBase obj);
+
+    /*
+     * Creates a Sampler.
+     *
+     * @param magFilter Magnification value for the filter
+     * @param minFilter Minification value for the filter
+     * @param wrapS S wrapping mode for the sampler
+     * @param wrapT T wrapping mode for the sampler
+     * @param wrapR R wrapping mode for the sampler
+     * @param aniso Anisotropy setting for the sampler
+     * @return sampler Created Sampler
+     */
+    @callflow(next={"*"})
+    samplerCreate(SamplerValue magFilter, SamplerValue minFilter,
+                  SamplerValue wrapS, SamplerValue wrapT, SamplerValue wrapR,
+                  float aniso)
+       generates (Sampler sampler);
+
+    /*
+     * Binds an Allocation to a global pointer in the Script.
+     *
+     * @param script Script to be bound to
+     * @param allocation Allocation to be bound
+     * @param slot Slot of a global variable
+     */
+    @callflow(next={"*"})
+    scriptBindAllocation(Script script, Allocation allocation, uint32_t slot);
+
+    /*
+     * TODO: is this necessary?
+     *
+     * Sets the timezone of a Script.
+     *
+     * @param script Script to be altered
+     * @param timeZone Time Zone value as text
+     */
+    @callflow(next={"*"})
+    scriptSetTimeZone(Script script, string timeZone);
+
+    /*
+     * TODO: can scriptInvoke be combined with scriptInvokeV?
+     *
+     * Launches an invokable function.
+     *
+     * @param vs Script to be invoked
+     * @param slot Slot of invokable function
+     */
+    @callflow(next={"*"})
+    scriptInvoke(Script vs, uint32_t slot);
+
+    /*
+     * Invokes a Script with values.
+     *
+     * @param vs Script to be invoked
+     * @param slot Slot
+     * @param data Data buffer of packed arguments
+     */
+    @callflow(next={"*"})
+    scriptInvokeV(Script vs, uint32_t slot, vec<uint8_t> data);
+
+    /*
+     * TODO: add documentation for params
+     * TODO: Should we rename "ScriptCall" to "LaunchOptions"?
+     *
+     * Launches a ForEach kernel.
+     *
+     * @param vs Script
+     * @param slot Slot of ForEach Kernel
+     * @param vains Collection of input Allocations or null
+     * @param vaout Output Allocation or null
+     * @param params Collection of parameters
+     * @param sc Pointer to a ScriptCall, nullptr if unused
+     */
+    @callflow(next={"*"})
+    scriptForEach(Script vs, uint32_t slot, vec<Allocation> vains,
+                  Allocation vaout, vec<uint8_t> params, Ptr sc);
+
+    /*
+     * Launches a Reduction kernel.
+     *
+     * @param vs Script
+     * @param slot Slot of Reduction Kernel
+     * @param vains Collection of input Allocations
+     * @param vaout Output Allocation
+     * @param sc Pointer to a ScriptCall, nullptr if unused
+     */
+    @callflow(next={"*"})
+    scriptReduce(Script vs, uint32_t slot, vec<Allocation> vains,
+                 Allocation vaout, Ptr sc);
+
+    /*
+     * Sets a Script's integer variable to a value.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param value Value to be pushed to variable
+     */
+    @callflow(next={"*"})
+    scriptSetVarI(Script vs, uint32_t slot, int32_t value);
+
+    /*
+     * Sets a Script's Object variable to a value
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param obj ObjectBase
+     */
+    @callflow(next={"*"})
+    scriptSetVarObj( Script vs,  uint32_t slot, ObjectBase obj);
+
+    /*
+     * Sets a Script's long variable to a value.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param value Value to be pushed to variable
+     */
+    @callflow(next={"*"})
+    scriptSetVarJ(Script vs, uint32_t slot, int64_t value);
+
+    /*
+     * Sets a Script's float variable to a value.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param value Value to be pushed to variable
+     */
+    @callflow(next={"*"})
+    scriptSetVarF(Script vs, uint32_t slot, float value);
+
+    /*
+     * Sets a Script's double variable to a value.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param value Value to be pushed to variable
+     */
+    @callflow(next={"*"})
+    scriptSetVarD(Script vs, uint32_t slot, double value);
+
+    /*
+     * Sets a Script's struct variable to a value.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param data Data to be pushed to variable
+     */
+    @callflow(next={"*"})
+    scriptSetVarV(Script vs, uint32_t slot, vec<uint8_t> data);
+
+    /*
+     * TODO: Why do we have typed setters but only untyped getter?
+     *
+     * Retrieves the value from a global variable in a script.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be read
+     * @param len Size of data to be filled
+     * @return data Data to be updated
+     */
+    @callflow(next={"*"})
+    scriptGetVarV(Script vs, uint32_t slot, Size len)
+       generates (vec<uint8_t> data);
+
+    /*
+     * TODO: Is this a value to be replicated for each member of the array? Or
+     * is there a representation for each separate member?
+     *
+     * Sets the value of a global array of structs, given the Element and
+     * dimension.
+     *
+     * @param vs RenderScript Script
+     * @param slot Slot number of variable to be updated
+     * @param data Data
+     * @param ve Element
+     * @param dims Collection of dimensions
+     */
+    @callflow(next={"*"})
+    scriptSetVarVE(Script vs, uint32_t slot, vec<uint8_t> data, Element ve,
+                   vec<uint32_t> dims);
+
+    /*
+     * TODO: is cacheDir redundant with createCache() function? Can we remove
+     * it?
+     * TODO: define resName more clearly
+     *
+     * Creates a RenderScript C99 kernel script.
+     *
+     * @param resName Resource name of the bitcode
+     * @param cacheDir Cache directory name
+     * @param text The kernel's bitcode as a uint8_t vector
+     * @return script Created Script
+     */
+    @callflow(next={"*"})
+    scriptCCreate(string resName, string cacheDir, vec<uint8_t> text)
+       generates (Script script);
+
+    /*
+     * Creates a RenderScript Intrinsic script.
+     *
+     * @param id Intrinsic Script identifier
+     * @param elem Element
+     * @return script Created Script
+     */
+    @callflow(next={"*"})
+    scriptIntrinsicCreate(ScriptIntrinsicID id, Element elem)
+               generates (Script script);
+
+};
diff --git a/renderscript/1.0/IDevice.hal b/renderscript/1.0/IDevice.hal
new file mode 100644
index 0000000..7b1b866
--- /dev/null
+++ b/renderscript/1.0/IDevice.hal
@@ -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.
+ */
+
+package android.hardware.renderscript@1.0;
+
+import android.hardware.renderscript@1.0::types;
+import IContext;
+
+interface IDevice {
+
+    /*
+     * Creates a RenderScript context.
+     *
+     * @param sdkVersion Target RS API level
+     * @param ct Context type
+     * @param flags Optional flags for this context
+     * @return context Created context
+     */
+    @entry
+    @callflow(next={"*"})
+    contextCreate(uint32_t sdkVersion, ContextType ct,
+                  bitfield<ContextFlags> flags)
+       generates (IContext context);
+
+};
diff --git a/renderscript/1.0/default/Android.bp b/renderscript/1.0/default/Android.bp
new file mode 100644
index 0000000..348f6af
--- /dev/null
+++ b/renderscript/1.0/default/Android.bp
@@ -0,0 +1,22 @@
+cc_library_shared {
+    name: "android.hardware.renderscript@1.0-impl",
+    relative_install_path: "hw",
+    proprietary: true,
+    srcs: [
+        "Context.cpp",
+        "Device.cpp",
+    ],
+    include_dirs: [
+        "frameworks/rs",
+    ],
+    shared_libs: [
+        "libdl",
+        "liblog",
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hardware.renderscript@1.0",
+        "android.hidl.base@1.0",
+    ],
+}
diff --git a/renderscript/1.0/default/Context.cpp b/renderscript/1.0/default/Context.cpp
new file mode 100644
index 0000000..5a09cf9
--- /dev/null
+++ b/renderscript/1.0/default/Context.cpp
@@ -0,0 +1,757 @@
+#define LOG_TAG "android.hardware.renderscript@1.0-impl"
+
+#include "Context.h"
+#include "Device.h"
+
+namespace android {
+namespace hardware {
+namespace renderscript {
+namespace V1_0 {
+namespace implementation {
+
+
+Context::Context(uint32_t sdkVersion, ContextType ct, int32_t flags) {
+    RsDevice _dev = nullptr;
+    uint32_t _version = 0;
+    uint32_t _sdkVersion = sdkVersion;
+    RsContextType _ct = static_cast<RsContextType>(ct);
+    int32_t _flags = flags;
+    mContext = Device::getHal().ContextCreate(_dev, _version, _sdkVersion, _ct, _flags);
+}
+
+
+// Helper functions
+template<typename ReturnType>
+static ReturnType hidl_to_rs(OpaqueHandle src) {
+    return reinterpret_cast<ReturnType>(static_cast<uintptr_t>(src));
+}
+
+template<typename ReturnType, typename SourceType>
+static ReturnType hidl_to_rs(SourceType* src) {
+    return reinterpret_cast<ReturnType>(src);
+}
+
+template<typename RsType, typename HidlType, typename Operation>
+static std::vector<RsType> hidl_to_rs(const hidl_vec<HidlType>& src, Operation operation) {
+    std::vector<RsType> dst(src.size());
+    std::transform(src.begin(), src.end(), dst.begin(), operation);
+    return dst;
+}
+
+template<typename ReturnType, typename SourceType>
+static ReturnType rs_to_hidl(SourceType* src) {
+    return static_cast<ReturnType>(reinterpret_cast<uintptr_t>(src));
+}
+
+template<typename HidlType, typename RsType, typename Operation>
+static hidl_vec<HidlType> rs_to_hidl(const std::vector<RsType>& src, Operation operation) {
+    std::vector<HidlType> dst(src.size());
+    std::transform(src.begin(), src.end(), dst.begin(), operation);
+    return dst;
+}
+
+
+// Methods from ::android::hardware::renderscript::V1_0::IContext follow.
+
+Return<Allocation> Context::allocationAdapterCreate(Type type, Allocation baseAlloc) {
+    RsType _type = hidl_to_rs<RsType>(type);
+    RsAllocation _baseAlloc = hidl_to_rs<RsAllocation>(baseAlloc);
+    RsAllocation _subAlloc = Device::getHal().AllocationAdapterCreate(mContext, _type, _baseAlloc);
+    return rs_to_hidl<Allocation>(_subAlloc);
+}
+
+Return<void> Context::allocationAdapterOffset(Allocation alloc, const hidl_vec<uint32_t>& offsets) {
+    RsAllocation _alloc = hidl_to_rs<RsAllocation>(alloc);
+    const hidl_vec<uint32_t>& _offsets = offsets;
+    Device::getHal().AllocationAdapterOffset(mContext, _alloc, _offsets.data(), _offsets.size());
+    return Void();
+}
+
+Return<Type> Context::allocationGetType(Allocation allocation) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    const void* _type = Device::getHal().AllocationGetType(mContext, _allocation);
+    return rs_to_hidl<Type>(_type);
+}
+
+Return<Allocation> Context::allocationCreateTyped(Type type, AllocationMipmapControl mips, int32_t usage, Ptr ptr) {
+    RsType _type = hidl_to_rs<RsType>(type);
+    RsAllocationMipmapControl _mips = static_cast<RsAllocationMipmapControl>(mips);
+    uint32_t _usage = usage;
+    uintptr_t _ptr = hidl_to_rs<uintptr_t>(ptr);
+    RsAllocation _allocation = Device::getHal().AllocationCreateTyped(mContext, _type, _mips, _usage, _ptr);
+    return rs_to_hidl<Allocation>(_allocation);
+}
+
+Return<Allocation> Context::allocationCreateFromBitmap(Type type, AllocationMipmapControl mips, const hidl_vec<uint8_t>& bitmap, int32_t usage) {
+    RsType _type = hidl_to_rs<RsType>(type);
+    RsAllocationMipmapControl _mips = static_cast<RsAllocationMipmapControl>(mips);
+    const hidl_vec<uint8_t>& _bitmap = bitmap;
+    uint32_t _usage = usage;
+    RsAllocation _allocation = Device::getHal().AllocationCreateFromBitmap(mContext, _type, _mips, _bitmap.data(), _bitmap.size(), _usage);
+    return rs_to_hidl<Allocation>(_allocation);
+}
+
+Return<Allocation> Context::allocationCubeCreateFromBitmap(Type type, AllocationMipmapControl mips, const hidl_vec<uint8_t>& bitmap, int32_t usage) {
+    RsType _type = hidl_to_rs<RsType>(type);
+    RsAllocationMipmapControl _mips = static_cast<RsAllocationMipmapControl>(mips);
+    const hidl_vec<uint8_t>& _bitmap = bitmap;
+    uint32_t _usage = usage;
+    RsAllocation _allocation = Device::getHal().AllocationCubeCreateFromBitmap(mContext, _type, _mips, _bitmap.data(), _bitmap.size(), _usage);
+    return rs_to_hidl<Allocation>(_allocation);
+}
+
+Return<NativeWindow> Context::allocationGetNativeWindow(Allocation allocation) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    RsNativeWindow _nativeWindow = Device::getHal().AllocationGetSurface(mContext, _allocation);
+    return rs_to_hidl<NativeWindow>(_nativeWindow);
+}
+
+Return<void> Context::allocationSetNativeWindow(Allocation allocation, NativeWindow nativewindow) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    RsNativeWindow _nativewindow = hidl_to_rs<RsNativeWindow>(nativewindow);
+    Device::getHal().AllocationSetSurface(mContext, _allocation, _nativewindow);
+    return Void();
+}
+
+Return<void> Context::allocationSetupBufferQueue(Allocation alloc, uint32_t numBuffer) {
+    RsAllocation _alloc = hidl_to_rs<RsAllocation>(alloc);
+    uint32_t _numBuffer = numBuffer;
+    Device::getHal().AllocationSetupBufferQueue(mContext, _alloc, _numBuffer);
+    return Void();
+}
+
+Return<void> Context::allocationShareBufferQueue(Allocation baseAlloc, Allocation subAlloc) {
+    RsAllocation _baseAlloc = hidl_to_rs<RsAllocation>(baseAlloc);
+    RsAllocation _subAlloc = hidl_to_rs<RsAllocation>(subAlloc);
+    Device::getHal().AllocationShareBufferQueue(mContext, _baseAlloc, _subAlloc);
+    return Void();
+}
+
+Return<void> Context::allocationCopyToBitmap(Allocation allocation, Ptr data, Size sizeBytes) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    void* _data = hidl_to_rs<void*>(data);
+    size_t _sizeBytes = static_cast<size_t>(sizeBytes);
+    Device::getHal().AllocationCopyToBitmap(mContext, _allocation, _data, _sizeBytes);
+    return Void();
+}
+
+Return<void> Context::allocation1DWrite(Allocation allocation, uint32_t offset, uint32_t lod, uint32_t count, const hidl_vec<uint8_t>& data) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _offset = offset;
+    uint32_t _lod = lod;
+    uint32_t _count = count;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _sizeBytes = data.size();
+    Device::getHal().Allocation1DData(mContext, _allocation, _offset, _lod, _count, _dataPtr, _sizeBytes);
+    return Void();
+}
+
+Return<void> Context::allocationElementWrite(Allocation allocation, uint32_t x, uint32_t y, uint32_t z, uint32_t lod, const hidl_vec<uint8_t>& data, Size compIdx) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _x = x;
+    uint32_t _y = y;
+    uint32_t _z = z;
+    uint32_t _lod = lod;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _sizeBytes = data.size();
+    size_t _compIdx = static_cast<size_t>(compIdx);
+    Device::getHal().AllocationElementData(mContext, _allocation, _x, _y, _z, _lod, _dataPtr, _sizeBytes, _compIdx);
+    return Void();
+}
+
+Return<void> Context::allocation2DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t lod, AllocationCubemapFace face, uint32_t w, uint32_t h, const hidl_vec<uint8_t>& data, Size stride) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _xoff = xoff;
+    uint32_t _yoff = yoff;
+    uint32_t _lod = lod;
+    RsAllocationCubemapFace _face = static_cast<RsAllocationCubemapFace>(face);
+    uint32_t _w = w;
+    uint32_t _h = h;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _sizeBytes = data.size();
+    size_t _stride = static_cast<size_t>(stride);
+    Device::getHal().Allocation2DData(mContext, _allocation, _xoff, _yoff, _lod, _face, _w, _h, _dataPtr, _sizeBytes, _stride);
+    return Void();
+}
+
+Return<void> Context::allocation3DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, uint32_t d, const hidl_vec<uint8_t>& data, Size stride) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _xoff = xoff;
+    uint32_t _yoff = yoff;
+    uint32_t _zoff = zoff;
+    uint32_t _lod = lod;
+    uint32_t _w = w;
+    uint32_t _h = h;
+    uint32_t _d = d;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _sizeBytes = data.size();
+    size_t _stride = static_cast<size_t>(stride);
+    Device::getHal().Allocation3DData(mContext, _allocation, _xoff, _yoff, _zoff, _lod, _w, _h, _d, _dataPtr, _sizeBytes, _stride);
+    return Void();
+}
+
+Return<void> Context::allocationGenerateMipmaps(Allocation allocation) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    Device::getHal().AllocationGenerateMipmaps(mContext, _allocation);
+    return Void();
+}
+
+Return<void> Context::allocationRead(Allocation allocation, Ptr data, Size sizeBytes) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    void* _data = hidl_to_rs<void*>(data);
+    size_t _sizeBytes = static_cast<size_t>(sizeBytes);
+    Device::getHal().AllocationRead(mContext, _allocation, _data, _sizeBytes);
+    return Void();
+}
+
+Return<void> Context::allocation1DRead(Allocation allocation, uint32_t xoff, uint32_t lod, uint32_t count, Ptr data, Size sizeBytes) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _xoff = xoff;
+    uint32_t _lod = lod;
+    uint32_t _count = count;
+    void* _data = hidl_to_rs<void*>(data);
+    size_t _sizeBytes = static_cast<size_t>(sizeBytes);
+    Device::getHal().Allocation1DRead(mContext, _allocation, _xoff, _lod, _count, _data, _sizeBytes);
+    return Void();
+}
+
+Return<void> Context::allocationElementRead(Allocation allocation, uint32_t x, uint32_t y, uint32_t z, uint32_t lod, Ptr data, Size sizeBytes, Size compIdx) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _x = x;
+    uint32_t _y = y;
+    uint32_t _z = z;
+    uint32_t _lod = lod;
+    void* _data = hidl_to_rs<void*>(data);
+    size_t _sizeBytes = static_cast<size_t>(sizeBytes);
+    size_t _compIdx = static_cast<size_t>(compIdx);
+    Device::getHal().AllocationElementRead(mContext, _allocation, _x, _y, _z, _lod, _data, _sizeBytes, _compIdx);
+    return Void();
+}
+
+Return<void> Context::allocation2DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t lod, AllocationCubemapFace face, uint32_t w, uint32_t h, Ptr data, Size sizeBytes, Size stride) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _xoff = xoff;
+    uint32_t _yoff = yoff;
+    uint32_t _lod = lod;
+    RsAllocationCubemapFace _face = static_cast<RsAllocationCubemapFace>(face);
+    uint32_t _w = w;
+    uint32_t _h = h;
+    void* _data = hidl_to_rs<void*>(data);
+    size_t _sizeBytes = static_cast<size_t>(sizeBytes);
+    size_t _stride = static_cast<size_t>(stride);
+    Device::getHal().Allocation2DRead(mContext, _allocation, _xoff, _yoff, _lod, _face, _w, _h, _data, _sizeBytes, _stride);
+    return Void();
+}
+
+Return<void> Context::allocation3DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, uint32_t d, Ptr data, Size sizeBytes, Size stride) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _xoff = xoff;
+    uint32_t _yoff = yoff;
+    uint32_t _zoff = zoff;
+    uint32_t _lod = lod;
+    uint32_t _w = w;
+    uint32_t _h = h;
+    uint32_t _d = d;
+    void* _dataPtr = hidl_to_rs<void*>(data);
+    size_t _sizeBytes = static_cast<size_t>(sizeBytes);
+    size_t _stride = static_cast<size_t>(stride);
+    Device::getHal().Allocation3DRead(mContext, _allocation, _xoff, _yoff, _zoff, _lod, _w, _h, _d, _dataPtr, _sizeBytes, _stride);
+    return Void();
+}
+
+Return<void> Context::allocationSyncAll(Allocation allocation, AllocationUsageType usageType) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    RsAllocationUsageType _usageType = static_cast<RsAllocationUsageType>(usageType);
+    Device::getHal().AllocationSyncAll(mContext, _allocation, _usageType);
+    return Void();
+}
+
+Return<void> Context::allocationResize1D(Allocation allocation, uint32_t dimX) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _dimX = dimX;
+    Device::getHal().AllocationResize1D(mContext, _allocation, _dimX);
+    return Void();
+}
+
+Return<void> Context::allocationCopy2DRange(Allocation dstAlloc, uint32_t dstXoff, uint32_t dstYoff, uint32_t dstMip, AllocationCubemapFace dstFace, uint32_t width, uint32_t height, Allocation srcAlloc, uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip, AllocationCubemapFace srcFace) {
+    RsAllocation _dstAlloc = hidl_to_rs<RsAllocation>(dstAlloc);
+    uint32_t _dstXoff = dstXoff;
+    uint32_t _dstYoff = dstYoff;
+    uint32_t _dstMip = dstMip;
+    RsAllocationCubemapFace _dstFace = static_cast<RsAllocationCubemapFace>(dstFace);
+    uint32_t _width = width;
+    uint32_t _height = height;
+    RsAllocation _srcAlloc = hidl_to_rs<RsAllocation>(srcAlloc);
+    uint32_t _srcXoff = srcXoff;
+    uint32_t _srcYoff = srcYoff;
+    uint32_t _srcMip = srcMip;
+    RsAllocationCubemapFace _srcFace = static_cast<RsAllocationCubemapFace>(srcFace);
+    Device::getHal().AllocationCopy2DRange(mContext, _dstAlloc, _dstXoff, _dstYoff, _dstMip, _dstFace, _width, _height, _srcAlloc, _srcXoff, _srcYoff, _srcMip, _srcFace);
+    return Void();
+}
+
+Return<void> Context::allocationCopy3DRange(Allocation dstAlloc, uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, uint32_t dstMip, uint32_t width, uint32_t height, uint32_t depth, Allocation srcAlloc, uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, uint32_t srcMip) {
+    RsAllocation _dstAlloc = hidl_to_rs<RsAllocation>(dstAlloc);
+    uint32_t _dstXoff = dstXoff;
+    uint32_t _dstYoff = dstYoff;
+    uint32_t _dstZoff = dstZoff;
+    uint32_t _dstMip = dstMip;
+    uint32_t _width = width;
+    uint32_t _height = height;
+    uint32_t _depth = depth;
+    RsAllocation _srcAlloc = hidl_to_rs<RsAllocation>(srcAlloc);
+    uint32_t _srcXoff = srcXoff;
+    uint32_t _srcYoff = srcYoff;
+    uint32_t _srcZoff = srcZoff;
+    uint32_t _srcMip = srcMip;
+    Device::getHal().AllocationCopy3DRange(mContext, _dstAlloc, _dstXoff, _dstYoff, _dstZoff, _dstMip, _width, _height, _depth, _srcAlloc, _srcXoff, _srcYoff, _srcZoff, _srcMip);
+    return Void();
+}
+
+Return<void> Context::allocationIoSend(Allocation allocation) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    Device::getHal().AllocationIoSend(mContext, _allocation);
+    return Void();
+}
+
+Return<void> Context::allocationIoReceive(Allocation allocation) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    Device::getHal().AllocationIoReceive(mContext, _allocation);
+    return Void();
+}
+
+Return<void> Context::allocationGetPointer(Allocation allocation, uint32_t lod, AllocationCubemapFace face, uint32_t z, allocationGetPointer_cb _hidl_cb) {
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _lod = lod;
+    RsAllocationCubemapFace _face = static_cast<RsAllocationCubemapFace>(face);
+    uint32_t _z = z;
+    uint32_t _array = 0;
+    size_t _stride = 0;
+    void* _dataPtr = Device::getHal().AllocationGetPointer(mContext, _allocation, _lod, _face, _z, _array, &_stride, sizeof(size_t));
+    Ptr dataPtr = reinterpret_cast<Ptr>(_dataPtr);
+    Size stride = static_cast<Size>(_stride);
+    _hidl_cb(dataPtr, stride);
+    return Void();
+}
+
+Return<void> Context::elementGetNativeMetadata(Element element, elementGetNativeMetadata_cb _hidl_cb) {
+    RsElement _element = hidl_to_rs<RsElement>(element);
+    std::vector<uint32_t> _elemData(5);
+    Device::getHal().ElementGetNativeData(mContext, _element, _elemData.data(), _elemData.size());
+    hidl_vec<uint32_t> elemData = _elemData;
+    _hidl_cb(elemData);
+    return Void();
+}
+
+Return<void> Context::elementGetSubElements(Element element, Size numSubElem, elementGetSubElements_cb _hidl_cb) {
+    RsElement _element = hidl_to_rs<RsElement>(element);
+    uint32_t _numSubElem = static_cast<uint32_t>(numSubElem);
+    std::vector<uintptr_t> _ids(_numSubElem);
+    std::vector<const char*> _names(_numSubElem);
+    std::vector<size_t> _arraySizes(_numSubElem);
+    Device::getHal().ElementGetSubElements(mContext, _element, _ids.data(), _names.data(), _arraySizes.data(), _numSubElem);
+    hidl_vec<Element>     ids        = rs_to_hidl<Element>(_ids,       [](uintptr_t val) { return static_cast<Element>(val); });
+    hidl_vec<hidl_string> names      = rs_to_hidl<hidl_string>(_names, [](const char* val) { return val; });
+    hidl_vec<Size>        arraySizes = rs_to_hidl<Size>(_arraySizes,   [](size_t val) { return static_cast<Size>(val); });
+    _hidl_cb(ids, names, arraySizes);
+    return Void();
+}
+
+Return<Element> Context::elementCreate(DataType dt, DataKind dk, bool norm, uint32_t size) {
+    RsDataType _dt = static_cast<RsDataType>(dt);
+    RsDataKind _dk = static_cast<RsDataKind>(dk);
+    bool _norm = norm;
+    uint32_t _size = size;
+    RsElement _element = Device::getHal().ElementCreate(mContext, _dt, _dk, _norm, _size);
+    return rs_to_hidl<Element>(_element);
+}
+
+Return<Element> Context::elementComplexCreate(const hidl_vec<Element>& eins, const hidl_vec<hidl_string>& names, const hidl_vec<Size>& arraySizes) {
+    std::vector<RsElement>   _eins           = hidl_to_rs<RsElement>(eins,      [](Element val) { return hidl_to_rs<RsElement>(val); });
+    std::vector<const char*> _namesPtr       = hidl_to_rs<const char*>(names,   [](const hidl_string& val) { return val.c_str(); });
+    std::vector<size_t>      _nameLengthsPtr = hidl_to_rs<size_t>(names,        [](const hidl_string& val) { return val.size(); });
+    std::vector<uint32_t>    _arraySizes     = hidl_to_rs<uint32_t>(arraySizes, [](Size val) { return static_cast<uint32_t>(val); });
+    RsElement _element = Device::getHal().ElementCreate2(mContext, _eins.data(), _eins.size(), _namesPtr.data(), _namesPtr.size(), _nameLengthsPtr.data(), _arraySizes.data(), _arraySizes.size());
+    return rs_to_hidl<Element>(_element);
+}
+
+Return<void> Context::typeGetNativeMetadata(Type type, typeGetNativeMetadata_cb _hidl_cb) {
+    RsType _type = hidl_to_rs<RsType>(type);
+    std::vector<uintptr_t> _metadata(6);
+    Device::getHal().TypeGetNativeData(mContext, _type, _metadata.data(), _metadata.size());
+    hidl_vec<OpaqueHandle> metadata = rs_to_hidl<OpaqueHandle>(_metadata, [](uintptr_t val) { return static_cast<OpaqueHandle>(val); });
+    _hidl_cb(metadata);
+    return Void();
+}
+
+Return<Type> Context::typeCreate(Element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ, bool mipmaps, bool faces, YuvFormat yuv) {
+    RsElement _element = hidl_to_rs<RsElement>(element);
+    uint32_t _dimX = dimX;
+    uint32_t _dimY = dimY;
+    uint32_t _dimZ = dimZ;
+    bool _mipmaps = mipmaps;
+    bool _faces = faces;
+    RsYuvFormat _yuv = static_cast<RsYuvFormat>(yuv);
+    RsType _type = Device::getHal().TypeCreate(mContext, _element, _dimX, _dimY, _dimZ, _mipmaps, _faces, _yuv);
+    return rs_to_hidl<Type>(_type);
+}
+
+Return<void> Context::contextDestroy() {
+    Device::getHal().ContextDestroy(mContext);
+    mContext = nullptr;
+    return Void();
+}
+
+Return<void> Context::contextGetMessage(Ptr data, Size size, contextGetMessage_cb _hidl_cb) {
+    void* _data = hidl_to_rs<void*>(data);
+    size_t _size = static_cast<size_t>(size);
+    size_t _receiveLen = 0;
+    uint32_t _subID = 0;
+    RsMessageToClientType _messageType = Device::getHal().ContextGetMessage(mContext, _data, _size, &_receiveLen, sizeof(size_t), &_subID, sizeof(uint32_t));
+    MessageToClientType messageType = static_cast<MessageToClientType>(_messageType);
+    Size receiveLen = static_cast<Size>(_receiveLen);
+    _hidl_cb(messageType, receiveLen);
+    return Void();
+}
+
+Return<void> Context::contextPeekMessage(contextPeekMessage_cb _hidl_cb) {
+    size_t _receiveLen = 0;
+    uint32_t _subID = 0;
+    RsMessageToClientType _messageType = Device::getHal().ContextPeekMessage(mContext, &_receiveLen, sizeof(size_t), &_subID, sizeof(uint32_t));
+    MessageToClientType messageType = static_cast<MessageToClientType>(_messageType);
+    Size receiveLen = static_cast<Size>(_receiveLen);
+    uint32_t subID = _subID;
+    _hidl_cb(messageType, receiveLen, subID);
+    return Void();
+}
+
+Return<void> Context::contextSendMessage(uint32_t id, const hidl_vec<uint8_t>& data) {
+    uint32_t _id = id;
+    const uint8_t* _dataPtr = data.data();
+    size_t _dataSize = data.size();
+    Device::getHal().ContextSendMessage(mContext, _id, _dataPtr, _dataSize);
+    return Void();
+}
+
+Return<void> Context::contextInitToClient() {
+    Device::getHal().ContextInitToClient(mContext);
+    return Void();
+}
+
+Return<void> Context::contextDeinitToClient() {
+    Device::getHal().ContextDeinitToClient(mContext);
+    return Void();
+}
+
+Return<void> Context::contextFinish() {
+    Device::getHal().ContextFinish(mContext);
+    return Void();
+}
+
+Return<void> Context::contextLog() {
+    uint32_t _bits = 0;
+    Device::getHal().ContextDump(mContext, _bits);
+    return Void();
+}
+
+Return<void> Context::contextSetPriority(ThreadPriorities priority) {
+    RsThreadPriorities _priority = static_cast<RsThreadPriorities>(priority);
+    Device::getHal().ContextSetPriority(mContext, _priority);
+    return Void();
+}
+
+Return<void> Context::contextSetCacheDir(const hidl_string& cacheDir) {
+    Device::getHal().ContextSetCacheDir(mContext, cacheDir.c_str(), cacheDir.size());
+    return Void();
+}
+
+Return<void> Context::assignName(ObjectBase obj, const hidl_string& name) {
+    RsObjectBase _obj = hidl_to_rs<RsObjectBase>(obj);
+    const hidl_string& _name = name;
+    Device::getHal().AssignName(mContext, _obj, _name.c_str(), _name.size());
+    return Void();
+}
+
+Return<void> Context::getName(ObjectBase obj, getName_cb _hidl_cb) {
+    void* _obj = hidl_to_rs<void*>(obj);
+    const char* _name = nullptr;
+    Device::getHal().GetName(mContext, _obj, &_name);
+    hidl_string name = _name;
+    _hidl_cb(name);
+    return Void();
+}
+
+Return<Closure> Context::closureCreate(ScriptKernelID kernelID, Allocation returnValue, const hidl_vec<ScriptFieldID>& fieldIDS, const hidl_vec<int64_t>& values, const hidl_vec<int32_t>& sizes, const hidl_vec<Closure>& depClosures, const hidl_vec<ScriptFieldID>& depFieldIDS) {
+    RsScriptKernelID _kernelID = hidl_to_rs<RsScriptKernelID>(kernelID);
+    RsAllocation _returnValue = hidl_to_rs<RsAllocation>(returnValue);
+    std::vector<RsScriptFieldID> _fieldIDS = hidl_to_rs<RsScriptFieldID>(fieldIDS, [](ScriptFieldID val) { return hidl_to_rs<RsScriptFieldID>(val); });
+    int64_t* _valuesPtr = const_cast<int64_t*>(values.data());
+    size_t _valuesLength = values.size();
+    std::vector<int>             _sizes       = hidl_to_rs<int>(sizes,                   [](int32_t val) { return static_cast<int>(val); });
+    std::vector<RsClosure>       _depClosures = hidl_to_rs<RsClosure>(depClosures,       [](Closure val) { return hidl_to_rs<RsClosure>(val); });
+    std::vector<RsScriptFieldID> _depFieldIDS = hidl_to_rs<RsScriptFieldID>(depFieldIDS, [](ScriptFieldID val) { return hidl_to_rs<RsScriptFieldID>(val); });
+    RsClosure _closure = Device::getHal().ClosureCreate(mContext, _kernelID, _returnValue, _fieldIDS.data(), _fieldIDS.size(), _valuesPtr, _valuesLength, _sizes.data(), _sizes.size(), _depClosures.data(), _depClosures.size(), _depFieldIDS.data(), _depFieldIDS.size());
+    return rs_to_hidl<Closure>(_closure);
+}
+
+Return<Closure> Context::invokeClosureCreate(ScriptInvokeID invokeID, const hidl_vec<uint8_t>& params, const hidl_vec<ScriptFieldID>& fieldIDS, const hidl_vec<int64_t>& values, const hidl_vec<int32_t>& sizes) {
+    RsScriptInvokeID _invokeID = hidl_to_rs<RsScriptInvokeID>(invokeID);
+    const void* _paramsPtr = params.data();
+    size_t _paramsSize = params.size();
+    std::vector<RsScriptFieldID> _fieldIDS = hidl_to_rs<RsScriptFieldID>(fieldIDS, [](ScriptFieldID val) { return hidl_to_rs<RsScriptFieldID>(val); });
+    const int64_t* _valuesPtr = values.data();
+    size_t _valuesLength = values.size();
+    std::vector<int> _sizes = hidl_to_rs<int>(sizes, [](int32_t val) { return static_cast<int>(val); });
+    RsClosure _closure = Device::getHal().InvokeClosureCreate(mContext, _invokeID, _paramsPtr, _paramsSize, _fieldIDS.data(), _fieldIDS.size(), _valuesPtr, _valuesLength, _sizes.data(), _sizes.size());
+    return rs_to_hidl<Closure>(_closure);
+}
+
+Return<void> Context::closureSetArg(Closure closure, uint32_t index, Ptr value, int32_t size) {
+    RsClosure _closure = hidl_to_rs<RsClosure>(closure);
+    uint32_t _index = index;
+    uintptr_t _value = hidl_to_rs<uintptr_t>(value);
+    int _size = static_cast<int>(size);
+    Device::getHal().ClosureSetArg(mContext, _closure, _index, _value, _size);
+    return Void();
+}
+
+Return<void> Context::closureSetGlobal(Closure closure, ScriptFieldID fieldID, int64_t value, int32_t size) {
+    RsClosure _closure = hidl_to_rs<RsClosure>(closure);
+    RsScriptFieldID _fieldID = hidl_to_rs<RsScriptFieldID>(fieldID);
+    int64_t _value = value;
+    int _size = static_cast<int>(size);
+    Device::getHal().ClosureSetGlobal(mContext, _closure, _fieldID, _value, _size);
+    return Void();
+}
+
+Return<ScriptKernelID> Context::scriptKernelIDCreate(Script script, int32_t slot, int32_t sig) {
+    RsScript _script = hidl_to_rs<RsScript>(script);
+    int _slot = static_cast<int>(slot);
+    int _sig = static_cast<int>(sig);
+    RsScriptKernelID _scriptKernelID = Device::getHal().ScriptKernelIDCreate(mContext, _script, _slot, _sig);
+    return rs_to_hidl<ScriptKernelID>(_scriptKernelID);
+}
+
+Return<ScriptInvokeID> Context::scriptInvokeIDCreate(Script script, int32_t slot) {
+    RsScript _script = hidl_to_rs<RsScript>(script);
+    int _slot = static_cast<int>(slot);
+    RsScriptInvokeID _scriptInvokeID = Device::getHal().ScriptInvokeIDCreate(mContext, _script, _slot);
+    return rs_to_hidl<ScriptInvokeID>(_scriptInvokeID);
+}
+
+Return<ScriptFieldID> Context::scriptFieldIDCreate(Script script, int32_t slot) {
+    RsScript _script = hidl_to_rs<RsScript>(script);
+    int _slot = static_cast<int>(slot);
+    RsScriptFieldID _scriptFieldID = Device::getHal().ScriptFieldIDCreate(mContext, _script, _slot);
+    return rs_to_hidl<ScriptFieldID>(_scriptFieldID);
+}
+
+Return<ScriptGroup> Context::scriptGroupCreate(const hidl_vec<ScriptKernelID>& kernels, const hidl_vec<ScriptKernelID>& srcK, const hidl_vec<ScriptKernelID>& dstK, const hidl_vec<ScriptFieldID>& dstF, const hidl_vec<Type>& types) {
+    std::vector<RsScriptKernelID> _kernels = hidl_to_rs<RsScriptKernelID>(kernels, [](ScriptFieldID val) { return hidl_to_rs<RsScriptKernelID>(val); });
+    std::vector<RsScriptKernelID> _srcK    = hidl_to_rs<RsScriptKernelID>(srcK,    [](ScriptFieldID val) { return hidl_to_rs<RsScriptKernelID>(val); });
+    std::vector<RsScriptKernelID> _dstK    = hidl_to_rs<RsScriptKernelID>(dstK,    [](ScriptFieldID val) { return hidl_to_rs<RsScriptKernelID>(val); });
+    std::vector<RsScriptFieldID>  _dstF    = hidl_to_rs<RsScriptFieldID>(dstF,     [](ScriptFieldID val) { return hidl_to_rs<RsScriptFieldID>(val); });
+    std::vector<RsType>           _types   = hidl_to_rs<RsType>(types,             [](Type val) { return hidl_to_rs<RsType>(val); });
+    RsScriptGroup _scriptGroup = Device::getHal().ScriptGroupCreate(mContext, _kernels.data(), _kernels.size(), _srcK.data(), _srcK.size(), _dstK.data(), _dstK.size(), _dstF.data(), _dstF.size(), _types.data(), _types.size());
+    return rs_to_hidl<ScriptGroup>(_scriptGroup);
+}
+
+Return<ScriptGroup2> Context::scriptGroup2Create(const hidl_string& name, const hidl_string& cacheDir, const hidl_vec<Closure>& closures) {
+    const hidl_string& _name = name;
+    const hidl_string& _cacheDir = cacheDir;
+    std::vector<RsClosure> _closures = hidl_to_rs<RsClosure>(closures, [](Closure val) { return hidl_to_rs<RsClosure>(val); });
+    RsScriptGroup2 _scriptGroup2 = Device::getHal().ScriptGroup2Create(mContext, _name.c_str(), _name.size(), _cacheDir.c_str(), _cacheDir.size(), _closures.data(), _closures.size());
+    return rs_to_hidl<ScriptGroup2>(_scriptGroup2);
+}
+
+Return<void> Context::scriptGroupSetOutput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc) {
+    RsScriptGroup _sg = hidl_to_rs<RsScriptGroup>(sg);
+    RsScriptKernelID _kid = hidl_to_rs<RsScriptKernelID>(kid);
+    RsAllocation _alloc = hidl_to_rs<RsAllocation>(alloc);
+    Device::getHal().ScriptGroupSetOutput(mContext, _sg, _kid, _alloc);
+    return Void();
+}
+
+Return<void> Context::scriptGroupSetInput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc) {
+    RsScriptGroup _sg = hidl_to_rs<RsScriptGroup>(sg);
+    RsScriptKernelID _kid = hidl_to_rs<RsScriptKernelID>(kid);
+    RsAllocation _alloc = hidl_to_rs<RsAllocation>(alloc);
+    Device::getHal().ScriptGroupSetInput(mContext, _sg, _kid, _alloc);
+    return Void();
+}
+
+Return<void> Context::scriptGroupExecute(ScriptGroup sg) {
+    RsScriptGroup _sg = hidl_to_rs<RsScriptGroup>(sg);
+    Device::getHal().ScriptGroupExecute(mContext, _sg);
+    return Void();
+}
+
+Return<void> Context::objDestroy(ObjectBase obj) {
+    RsAsyncVoidPtr _obj = hidl_to_rs<RsAsyncVoidPtr>(obj);
+    Device::getHal().ObjDestroy(mContext, _obj);
+    return Void();
+}
+
+Return<Sampler> Context::samplerCreate(SamplerValue magFilter, SamplerValue minFilter, SamplerValue wrapS, SamplerValue wrapT, SamplerValue wrapR, float aniso) {
+    RsSamplerValue _magFilter = static_cast<RsSamplerValue>(magFilter);
+    RsSamplerValue _minFilter = static_cast<RsSamplerValue>(minFilter);
+    RsSamplerValue _wrapS = static_cast<RsSamplerValue>(wrapS);
+    RsSamplerValue _wrapT = static_cast<RsSamplerValue>(wrapT);
+    RsSamplerValue _wrapR = static_cast<RsSamplerValue>(wrapR);
+    float _aniso = static_cast<float>(aniso);
+    RsSampler _sampler = Device::getHal().SamplerCreate(mContext, _magFilter, _minFilter, _wrapS, _wrapT, _wrapR, _aniso);
+    return rs_to_hidl<Sampler>(_sampler);
+}
+
+Return<void> Context::scriptBindAllocation(Script script, Allocation allocation, uint32_t slot) {
+    RsScript _script = hidl_to_rs<RsScript>(script);
+    RsAllocation _allocation = hidl_to_rs<RsAllocation>(allocation);
+    uint32_t _slot = slot;
+    Device::getHal().ScriptBindAllocation(mContext, _script, _allocation, _slot);
+    return Void();
+}
+
+Return<void> Context::scriptSetTimeZone(Script script, const hidl_string& timeZone) {
+    RsScript _script = hidl_to_rs<RsScript>(script);
+    const hidl_string& _timeZone = timeZone;
+    Device::getHal().ScriptSetTimeZone(mContext, _script, _timeZone.c_str(), _timeZone.size());
+    return Void();
+}
+
+Return<void> Context::scriptInvoke(Script vs, uint32_t slot) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    Device::getHal().ScriptInvoke(mContext, _vs, _slot);
+    return Void();
+}
+
+Return<void> Context::scriptInvokeV(Script vs, uint32_t slot, const hidl_vec<uint8_t>& data) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _len = data.size();
+    Device::getHal().ScriptInvokeV(mContext, _vs, _slot, _dataPtr, _len);
+    return Void();
+}
+
+Return<void> Context::scriptForEach(Script vs, uint32_t slot, const hidl_vec<Allocation>& vains, Allocation vaout, const hidl_vec<uint8_t>& params, Ptr sc) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    std::vector<RsAllocation> _vains = hidl_to_rs<RsAllocation>(vains, [](Allocation val) { return hidl_to_rs<RsAllocation>(val); });
+    RsAllocation _vaout = hidl_to_rs<RsAllocation>(vaout);
+    const void* _paramsPtr = hidl_to_rs<const void*>(params.data());
+    size_t _paramLen = params.size();
+    const RsScriptCall* _sc = hidl_to_rs<const RsScriptCall*>(sc);
+    size_t _scLen = _sc != nullptr ? sizeof(ScriptCall) : 0;
+    Device::getHal().ScriptForEachMulti(mContext, _vs, _slot, _vains.data(), _vains.size(), _vaout, _paramsPtr, _paramLen, _sc, _scLen);
+    return Void();
+}
+
+Return<void> Context::scriptReduce(Script vs, uint32_t slot, const hidl_vec<Allocation>& vains, Allocation vaout, Ptr sc) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    std::vector<RsAllocation> _vains = hidl_to_rs<RsAllocation>(vains, [](Allocation val) { return hidl_to_rs<RsAllocation>(val); });
+    RsAllocation _vaout = hidl_to_rs<RsAllocation>(vaout);
+    const RsScriptCall* _sc = hidl_to_rs<const RsScriptCall*>(sc);
+    size_t _scLen = _sc != nullptr ? sizeof(ScriptCall) : 0;
+    Device::getHal().ScriptReduce(mContext, _vs, _slot, _vains.data(), _vains.size(), _vaout, _sc, _scLen);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarI(Script vs, uint32_t slot, int32_t value) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    int _value = static_cast<int>(value);
+    Device::getHal().ScriptSetVarI(mContext, _vs, _slot, _value);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarObj(Script vs, uint32_t slot, ObjectBase obj) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    RsObjectBase _obj = hidl_to_rs<RsObjectBase>(obj);
+    Device::getHal().ScriptSetVarObj(mContext, _vs, _slot, _obj);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarJ(Script vs, uint32_t slot, int64_t value) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    int64_t _value = static_cast<int64_t>(value);
+    Device::getHal().ScriptSetVarJ(mContext, _vs, _slot, _value);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarF(Script vs, uint32_t slot, float value) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    float _value = value;
+    Device::getHal().ScriptSetVarF(mContext, _vs, _slot, _value);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarD(Script vs, uint32_t slot, double value) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    double _value = value;
+    Device::getHal().ScriptSetVarD(mContext, _vs, _slot, _value);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarV(Script vs, uint32_t slot, const hidl_vec<uint8_t>& data) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _len = data.size();
+    Device::getHal().ScriptSetVarV(mContext, _vs, _slot, _dataPtr, _len);
+    return Void();
+}
+
+Return<void> Context::scriptGetVarV(Script vs, uint32_t slot, Size len, scriptGetVarV_cb _hidl_cb) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    size_t _len = static_cast<size_t>(len);
+    std::vector<uint8_t> _data(static_cast<size_t>(len));
+    Device::getHal().ScriptGetVarV(mContext, _vs, _slot, _data.data(), _data.size());
+    hidl_vec<uint8_t> data = _data;
+    _hidl_cb(data);
+    return Void();
+}
+
+Return<void> Context::scriptSetVarVE(Script vs, uint32_t slot, const hidl_vec<uint8_t>& data, Element ve, const hidl_vec<uint32_t>& dims) {
+    RsScript _vs = hidl_to_rs<RsScript>(vs);
+    uint32_t _slot = slot;
+    const void* _dataPtr = hidl_to_rs<const void*>(data.data());
+    size_t _len = data.size();
+    RsElement _ve = hidl_to_rs<RsElement>(ve);
+    const uint32_t* _dimsPtr = dims.data();
+    size_t _dimLen = dims.size();
+    Device::getHal().ScriptSetVarVE(mContext, _vs, _slot, _dataPtr, _len, _ve, _dimsPtr, _dimLen);
+    return Void();
+}
+
+Return<Script> Context::scriptCCreate(const hidl_string& resName, const hidl_string& cacheDir, const hidl_vec<uint8_t>& text) {
+    const hidl_string& _resName = resName;
+    const hidl_string& _cacheDir = cacheDir;
+    const char* _textPtr = hidl_to_rs<const char*>(text.data());
+    size_t _textSize = text.size();
+    RsScript _script = Device::getHal().ScriptCCreate(mContext, _resName.c_str(), _resName.size(), _cacheDir.c_str(), _cacheDir.size(), _textPtr, _textSize);
+    return rs_to_hidl<Script>(_script);
+}
+
+Return<Script> Context::scriptIntrinsicCreate(ScriptIntrinsicID id, Element elem) {
+    RsScriptIntrinsicID _id = static_cast<RsScriptIntrinsicID>(id);
+    RsElement _elem = hidl_to_rs<RsElement>(elem);
+    RsScript _script = Device::getHal().ScriptIntrinsicCreate(mContext, _id, _elem);
+    return rs_to_hidl<Script>(_script);
+}
+
+
+// Methods from ::android::hidl::base::V1_0::IBase follow.
+
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace renderscript
+}  // namespace hardware
+}  // namespace android
diff --git a/renderscript/1.0/default/Context.h b/renderscript/1.0/default/Context.h
new file mode 100644
index 0000000..38c45c5
--- /dev/null
+++ b/renderscript/1.0/default/Context.h
@@ -0,0 +1,129 @@
+#ifndef ANDROID_HARDWARE_RENDERSCRIPT_V1_0_CONTEXT_H
+#define ANDROID_HARDWARE_RENDERSCRIPT_V1_0_CONTEXT_H
+
+#include "cpp/rsDispatch.h"
+#include "dlfcn.h"
+#include <android/hardware/renderscript/1.0/IContext.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+
+namespace android {
+namespace hardware {
+namespace renderscript {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hardware::renderscript::V1_0::AllocationCubemapFace;
+using ::android::hardware::renderscript::V1_0::AllocationMipmapControl;
+using ::android::hardware::renderscript::V1_0::AllocationUsageType;
+using ::android::hardware::renderscript::V1_0::ContextType;
+using ::android::hardware::renderscript::V1_0::DataKind;
+using ::android::hardware::renderscript::V1_0::DataType;
+using ::android::hardware::renderscript::V1_0::IContext;
+using ::android::hardware::renderscript::V1_0::MessageToClientType;
+using ::android::hardware::renderscript::V1_0::SamplerValue;
+using ::android::hardware::renderscript::V1_0::ScriptCall;
+using ::android::hardware::renderscript::V1_0::ScriptIntrinsicID;
+using ::android::hardware::renderscript::V1_0::ThreadPriorities;
+using ::android::hardware::renderscript::V1_0::YuvFormat;
+using ::android::hidl::base::V1_0::IBase;
+using ::android::hardware::hidl_string;
+using ::android::hardware::hidl_vec;
+using ::android::hardware::Return;
+using ::android::hardware::Void;
+using ::android::sp;
+
+struct Context : public IContext {
+    Context(uint32_t sdkVersion, ContextType ct, int32_t flags);
+
+    // Methods from ::android::hardware::renderscript::V1_0::IContext follow.
+    Return<Allocation> allocationAdapterCreate(Type type, Allocation baseAlloc) override;
+    Return<void> allocationAdapterOffset(Allocation alloc, const hidl_vec<uint32_t>& offsets) override;
+    Return<Type> allocationGetType(Allocation allocation) override;
+    Return<Allocation> allocationCreateTyped(Type type, AllocationMipmapControl mips, int32_t usage, Ptr ptr) override;
+    Return<Allocation> allocationCreateFromBitmap(Type type, AllocationMipmapControl mips, const hidl_vec<uint8_t>& bitmap, int32_t usage) override;
+    Return<Allocation> allocationCubeCreateFromBitmap(Type type, AllocationMipmapControl mips, const hidl_vec<uint8_t>& bitmap, int32_t usage) override;
+    Return<NativeWindow> allocationGetNativeWindow(Allocation allocation) override;
+    Return<void> allocationSetNativeWindow(Allocation allocation, NativeWindow nativewindow) override;
+    Return<void> allocationSetupBufferQueue(Allocation alloc, uint32_t numBuffer) override;
+    Return<void> allocationShareBufferQueue(Allocation baseAlloc, Allocation subAlloc) override;
+    Return<void> allocationCopyToBitmap(Allocation allocation, Ptr data, Size sizeBytes) override;
+    Return<void> allocation1DWrite(Allocation allocation, uint32_t offset, uint32_t lod, uint32_t count, const hidl_vec<uint8_t>& data) override;
+    Return<void> allocationElementWrite(Allocation allocation, uint32_t x, uint32_t y, uint32_t z, uint32_t lod, const hidl_vec<uint8_t>& data, Size compIdx) override;
+    Return<void> allocation2DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t lod, AllocationCubemapFace face, uint32_t w, uint32_t h, const hidl_vec<uint8_t>& data, Size stride) override;
+    Return<void> allocation3DWrite(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, uint32_t d, const hidl_vec<uint8_t>& data, Size stride) override;
+    Return<void> allocationGenerateMipmaps(Allocation allocation) override;
+    Return<void> allocationRead(Allocation allocation, Ptr data, Size sizeBytes) override;
+    Return<void> allocation1DRead(Allocation allocation, uint32_t xoff, uint32_t lod, uint32_t count, Ptr data, Size sizeBytes) override;
+    Return<void> allocationElementRead(Allocation allocation, uint32_t x, uint32_t y, uint32_t z, uint32_t lod, Ptr data, Size sizeBytes, Size compIdx) override;
+    Return<void> allocation2DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t lod, AllocationCubemapFace face, uint32_t w, uint32_t h, Ptr data, Size sizeBytes, Size stride) override;
+    Return<void> allocation3DRead(Allocation allocation, uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t lod, uint32_t w, uint32_t h, uint32_t d, Ptr data, Size sizeBytes, Size stride) override;
+    Return<void> allocationSyncAll(Allocation allocation, AllocationUsageType usageType) override;
+    Return<void> allocationResize1D(Allocation allocation, uint32_t dimX) override;
+    Return<void> allocationCopy2DRange(Allocation dstAlloc, uint32_t dstXoff, uint32_t dstYoff, uint32_t dstMip, AllocationCubemapFace dstFace, uint32_t width, uint32_t height, Allocation srcAlloc, uint32_t srcXoff, uint32_t srcYoff, uint32_t srcMip, AllocationCubemapFace srcFace) override;
+    Return<void> allocationCopy3DRange(Allocation dstAlloc, uint32_t dstXoff, uint32_t dstYoff, uint32_t dstZoff, uint32_t dstMip, uint32_t width, uint32_t height, uint32_t depth, Allocation srcAlloc, uint32_t srcXoff, uint32_t srcYoff, uint32_t srcZoff, uint32_t srcMip) override;
+    Return<void> allocationIoSend(Allocation allocation) override;
+    Return<void> allocationIoReceive(Allocation allocation) override;
+    Return<void> allocationGetPointer(Allocation allocation, uint32_t lod, AllocationCubemapFace face, uint32_t z, allocationGetPointer_cb _hidl_cb) override;
+    Return<void> elementGetNativeMetadata(Element element, elementGetNativeMetadata_cb _hidl_cb) override;
+    Return<void> elementGetSubElements(Element element, Size numSubElem, elementGetSubElements_cb _hidl_cb) override;
+    Return<Element> elementCreate(DataType dt, DataKind dk, bool norm, uint32_t size) override;
+    Return<Element> elementComplexCreate(const hidl_vec<Element>& eins, const hidl_vec<hidl_string>& names, const hidl_vec<Size>& arraySizes) override;
+    Return<void> typeGetNativeMetadata(Type type, typeGetNativeMetadata_cb _hidl_cb) override;
+    Return<Type> typeCreate(Element element, uint32_t dimX, uint32_t dimY, uint32_t dimZ, bool mipmaps, bool faces, YuvFormat yuv) override;
+    Return<void> contextDestroy() override;
+    Return<void> contextGetMessage(Ptr data, Size size, contextGetMessage_cb _hidl_cb) override;
+    Return<void> contextPeekMessage(contextPeekMessage_cb _hidl_cb) override;
+    Return<void> contextSendMessage(uint32_t id, const hidl_vec<uint8_t>& data) override;
+    Return<void> contextInitToClient() override;
+    Return<void> contextDeinitToClient() override;
+    Return<void> contextFinish() override;
+    Return<void> contextLog() override;
+    Return<void> contextSetPriority(ThreadPriorities priority) override;
+    Return<void> contextSetCacheDir(const hidl_string& cacheDir) override;
+    Return<void> assignName(ObjectBase obj, const hidl_string& name) override;
+    Return<void> getName(ObjectBase obj, getName_cb _hidl_cb) override;
+    Return<Closure> closureCreate(ScriptKernelID kernelID, Allocation returnValue, const hidl_vec<ScriptFieldID>& fieldIDS, const hidl_vec<int64_t>& values, const hidl_vec<int32_t>& sizes, const hidl_vec<Closure>& depClosures, const hidl_vec<ScriptFieldID>& depFieldIDS) override;
+    Return<Closure> invokeClosureCreate(ScriptInvokeID invokeID, const hidl_vec<uint8_t>& params, const hidl_vec<ScriptFieldID>& fieldIDS, const hidl_vec<int64_t>& values, const hidl_vec<int32_t>& sizes) override;
+    Return<void> closureSetArg(Closure closure, uint32_t index, Ptr value, int32_t size) override;
+    Return<void> closureSetGlobal(Closure closure, ScriptFieldID fieldID, int64_t value, int32_t size) override;
+    Return<ScriptKernelID> scriptKernelIDCreate(Script script, int32_t slot, int32_t sig) override;
+    Return<ScriptInvokeID> scriptInvokeIDCreate(Script script, int32_t slot) override;
+    Return<ScriptFieldID> scriptFieldIDCreate(Script script, int32_t slot) override;
+    Return<ScriptGroup> scriptGroupCreate(const hidl_vec<ScriptKernelID>& kernels, const hidl_vec<ScriptKernelID>& srcK, const hidl_vec<ScriptKernelID>& dstK, const hidl_vec<ScriptFieldID>& dstF, const hidl_vec<Type>& types) override;
+    Return<ScriptGroup2> scriptGroup2Create(const hidl_string& name, const hidl_string& cacheDir, const hidl_vec<Closure>& closures) override;
+    Return<void> scriptGroupSetOutput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc) override;
+    Return<void> scriptGroupSetInput(ScriptGroup sg, ScriptKernelID kid, Allocation alloc) override;
+    Return<void> scriptGroupExecute(ScriptGroup sg) override;
+    Return<void> objDestroy(ObjectBase obj) override;
+    Return<Sampler> samplerCreate(SamplerValue magFilter, SamplerValue minFilter, SamplerValue wrapS, SamplerValue wrapT, SamplerValue wrapR, float aniso) override;
+    Return<void> scriptBindAllocation(Script script, Allocation allocation, uint32_t slot) override;
+    Return<void> scriptSetTimeZone(Script script, const hidl_string& timeZone) override;
+    Return<void> scriptInvoke(Script vs, uint32_t slot) override;
+    Return<void> scriptInvokeV(Script vs, uint32_t slot, const hidl_vec<uint8_t>& data) override;
+    Return<void> scriptForEach(Script vs, uint32_t slot, const hidl_vec<Allocation>& vains, Allocation vaout, const hidl_vec<uint8_t>& params, Ptr sc) override;
+    Return<void> scriptReduce(Script vs, uint32_t slot, const hidl_vec<Allocation>& vains, Allocation vaout, Ptr sc) override;
+    Return<void> scriptSetVarI(Script vs, uint32_t slot, int32_t value) override;
+    Return<void> scriptSetVarObj(Script vs, uint32_t slot, ObjectBase obj) override;
+    Return<void> scriptSetVarJ(Script vs, uint32_t slot, int64_t value) override;
+    Return<void> scriptSetVarF(Script vs, uint32_t slot, float value) override;
+    Return<void> scriptSetVarD(Script vs, uint32_t slot, double value) override;
+    Return<void> scriptSetVarV(Script vs, uint32_t slot, const hidl_vec<uint8_t>& data) override;
+    Return<void> scriptGetVarV(Script vs, uint32_t slot, Size len, scriptGetVarV_cb _hidl_cb) override;
+    Return<void> scriptSetVarVE(Script vs, uint32_t slot, const hidl_vec<uint8_t>& data, Element ve, const hidl_vec<uint32_t>& dims) override;
+    Return<Script> scriptCCreate(const hidl_string& resName, const hidl_string& cacheDir, const hidl_vec<uint8_t>& text) override;
+    Return<Script> scriptIntrinsicCreate(ScriptIntrinsicID id, Element elem) override;
+
+    // Methods from ::android::hidl::base::V1_0::IBase follow.
+
+ private:
+    RsContext mContext;
+};
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace renderscript
+}  // namespace hardware
+}  // namespace android
+
+#endif  // ANDROID_HARDWARE_RENDERSCRIPT_V1_0_CONTEXT_H
diff --git a/renderscript/1.0/default/Device.cpp b/renderscript/1.0/default/Device.cpp
new file mode 100644
index 0000000..86cf8eb
--- /dev/null
+++ b/renderscript/1.0/default/Device.cpp
@@ -0,0 +1,139 @@
+#include "Context.h"
+#include "Device.h"
+
+namespace android {
+namespace hardware {
+namespace renderscript {
+namespace V1_0 {
+namespace implementation {
+
+
+static dispatchTable loadHAL();
+dispatchTable Device::mDispatchHal = loadHAL();
+
+Device::Device() {
+}
+
+dispatchTable& Device::getHal() {
+    return mDispatchHal;
+}
+
+
+// Methods from ::android::hardware::renderscript::V1_0::IDevice follow.
+
+Return<sp<IContext>> Device::contextCreate(uint32_t sdkVersion, ContextType ct, int32_t flags) {
+    return new Context(sdkVersion, ct, flags);
+}
+
+
+// Methods from ::android::hidl::base::V1_0::IBase follow.
+
+IDevice* HIDL_FETCH_IDevice(const char* /* name */) {
+    return new Device();
+}
+
+// Helper function
+dispatchTable loadHAL() {
+
+    static_assert(sizeof(void*) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(void*) > sizeof(uint64_t)");
+    static_assert(sizeof(size_t) <= sizeof(uint64_t), "RenderScript HIDL Error: sizeof(size_t) > sizeof(uint64_t)");
+
+    const char* filename = "libRS_internal.so";
+    void* handle = dlopen(filename, RTLD_LAZY | RTLD_LOCAL);
+
+    dispatchTable dispatchHal = {
+        .SetNativeLibDir = (SetNativeLibDirFnPtr)nullptr,
+
+        .Allocation1DData = (Allocation1DDataFnPtr)dlsym(handle, "rsAllocation1DData"),
+        .Allocation1DElementData = (Allocation1DElementDataFnPtr)nullptr,
+        .Allocation1DRead = (Allocation1DReadFnPtr)dlsym(handle, "rsAllocation1DRead"),
+        .Allocation2DData = (Allocation2DDataFnPtr)dlsym(handle, "rsAllocation2DData"),
+        .Allocation2DRead = (Allocation2DReadFnPtr)dlsym(handle, "rsAllocation2DRead"),
+        .Allocation3DData = (Allocation3DDataFnPtr)dlsym(handle, "rsAllocation3DData"),
+        .Allocation3DRead = (Allocation3DReadFnPtr)dlsym(handle, "rsAllocation3DRead"),
+        .AllocationAdapterCreate = (AllocationAdapterCreateFnPtr)dlsym(handle, "rsAllocationAdapterCreate"),
+        .AllocationAdapterOffset = (AllocationAdapterOffsetFnPtr)dlsym(handle, "rsAllocationAdapterOffset"),
+        .AllocationCopy2DRange = (AllocationCopy2DRangeFnPtr)dlsym(handle, "rsAllocationCopy2DRange"),
+        .AllocationCopy3DRange = (AllocationCopy3DRangeFnPtr)dlsym(handle, "rsAllocationCopy3DRange"),
+        .AllocationCopyToBitmap = (AllocationCopyToBitmapFnPtr)dlsym(handle, "rsAllocationCopyToBitmap"),
+        .AllocationCreateFromBitmap = (AllocationCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCreateFromBitmap"),
+        .AllocationCreateStrided = (AllocationCreateStridedFnPtr)dlsym(handle, "rsAllocationCreateStrided"),
+        .AllocationCreateTyped = (AllocationCreateTypedFnPtr)dlsym(handle, "rsAllocationCreateTyped"),
+        .AllocationCubeCreateFromBitmap = (AllocationCubeCreateFromBitmapFnPtr)dlsym(handle, "rsAllocationCubeCreateFromBitmap"),
+        .AllocationElementData = (AllocationElementDataFnPtr)dlsym(handle, "rsAllocationElementData"),
+        .AllocationElementRead = (AllocationElementReadFnPtr)dlsym(handle, "rsAllocationElementRead"),
+        .AllocationGenerateMipmaps = (AllocationGenerateMipmapsFnPtr)dlsym(handle, "rsAllocationGenerateMipmaps"),
+        .AllocationGetPointer = (AllocationGetPointerFnPtr)dlsym(handle, "rsAllocationGetPointer"),
+        .AllocationGetSurface = (AllocationGetSurfaceFnPtr)dlsym(handle, "rsAllocationGetSurface"),
+        .AllocationGetType = (AllocationGetTypeFnPtr)dlsym(handle, "rsaAllocationGetType"),
+        .AllocationIoReceive = (AllocationIoReceiveFnPtr)dlsym(handle, "rsAllocationIoReceive"),
+        .AllocationIoSend = (AllocationIoSendFnPtr)dlsym(handle, "rsAllocationIoSend"),
+        .AllocationRead = (AllocationReadFnPtr)dlsym(handle, "rsAllocationRead"),
+        .AllocationResize1D = (AllocationResize1DFnPtr)dlsym(handle, "rsAllocationResize1D"),
+        .AllocationSetSurface = (AllocationSetSurfaceFnPtr)dlsym(handle, "rsAllocationSetSurface"),
+        .AllocationSetupBufferQueue = (AllocationSetupBufferQueueFnPtr)dlsym(handle, "rsAllocationSetupBufferQueue"),
+        .AllocationShareBufferQueue = (AllocationShareBufferQueueFnPtr)dlsym(handle, "rsAllocationShareBufferQueue"),
+        .AllocationSyncAll = (AllocationSyncAllFnPtr)dlsym(handle, "rsAllocationSyncAll"),
+        .AssignName = (AssignNameFnPtr)dlsym(handle, "rsAssignName"),
+        .ClosureCreate = (ClosureCreateFnPtr)dlsym(handle, "rsClosureCreate"),
+        .ClosureSetArg = (ClosureSetArgFnPtr)dlsym(handle, "rsClosureSetArg"),
+        .ClosureSetGlobal = (ClosureSetGlobalFnPtr)dlsym(handle, "rsClosureSetGlobal"),
+        .ContextCreate = (ContextCreateFnPtr)dlsym(handle, "rsContextCreate"),
+        .ContextDeinitToClient = (ContextDeinitToClientFnPtr)dlsym(handle, "rsContextDeinitToClient"),
+        .ContextDestroy = (ContextDestroyFnPtr)dlsym(handle, "rsContextDestroy"),
+        .ContextDump = (ContextDumpFnPtr)dlsym(handle, "rsContextDump"),
+        .ContextFinish = (ContextFinishFnPtr)dlsym(handle, "rsContextFinish"),
+        .ContextGetMessage = (ContextGetMessageFnPtr)dlsym(handle, "rsContextGetMessage"),
+        .ContextInitToClient = (ContextInitToClientFnPtr)dlsym(handle, "rsContextInitToClient"),
+        .ContextPeekMessage = (ContextPeekMessageFnPtr)dlsym(handle, "rsContextPeekMessage"),
+        .ContextSendMessage = (ContextSendMessageFnPtr)dlsym(handle, "rsContextSendMessage"),
+        .ContextSetCacheDir = (ContextSetCacheDirFnPtr)dlsym(handle, "rsContextSetCacheDir"),
+        .ContextSetPriority = (ContextSetPriorityFnPtr)dlsym(handle, "rsContextSetPriority"),
+        .DeviceCreate = (DeviceCreateFnPtr)nullptr,
+        .DeviceDestroy = (DeviceDestroyFnPtr)nullptr,
+        .DeviceSetConfig = (DeviceSetConfigFnPtr)nullptr,
+        .ElementCreate2 = (ElementCreate2FnPtr)dlsym(handle, "rsElementCreate2"),
+        .ElementCreate = (ElementCreateFnPtr)dlsym(handle, "rsElementCreate"),
+        .ElementGetNativeData = (ElementGetNativeDataFnPtr)dlsym(handle, "rsaElementGetNativeData"),
+        .ElementGetSubElements = (ElementGetSubElementsFnPtr)dlsym(handle, "rsaElementGetSubElements"),
+        .GetName = (GetNameFnPtr)dlsym(handle, "rsaGetName"),
+        .InvokeClosureCreate = (InvokeClosureCreateFnPtr)dlsym(handle, "rsInvokeClosureCreate"),
+        .ObjDestroy = (ObjDestroyFnPtr)dlsym(handle, "rsObjDestroy"),
+        .SamplerCreate = (SamplerCreateFnPtr)dlsym(handle, "rsSamplerCreate"),
+        .ScriptBindAllocation = (ScriptBindAllocationFnPtr)dlsym(handle, "rsScriptBindAllocation"),
+        .ScriptCCreate = (ScriptCCreateFnPtr)dlsym(handle, "rsScriptCCreate"),
+        .ScriptFieldIDCreate = (ScriptFieldIDCreateFnPtr)dlsym(handle, "rsScriptFieldIDCreate"),
+        .ScriptForEach = (ScriptForEachFnPtr)nullptr,
+        .ScriptForEachMulti = (ScriptForEachMultiFnPtr)dlsym(handle, "rsScriptForEachMulti"),
+        .ScriptGetVarV = (ScriptGetVarVFnPtr)dlsym(handle, "rsScriptGetVarV"),
+        .ScriptGroup2Create = (ScriptGroup2CreateFnPtr)dlsym(handle, "rsScriptGroup2Create"),
+        .ScriptGroupCreate = (ScriptGroupCreateFnPtr)dlsym(handle, "rsScriptGroupCreate"),
+        .ScriptGroupExecute = (ScriptGroupExecuteFnPtr)dlsym(handle, "rsScriptGroupExecute"),
+        .ScriptGroupSetInput = (ScriptGroupSetInputFnPtr)dlsym(handle, "rsScriptGroupSetInput"),
+        .ScriptGroupSetOutput = (ScriptGroupSetOutputFnPtr)dlsym(handle, "rsScriptGroupSetOutput"),
+        .ScriptIntrinsicCreate = (ScriptIntrinsicCreateFnPtr)dlsym(handle, "rsScriptIntrinsicCreate"),
+        .ScriptInvoke = (ScriptInvokeFnPtr)dlsym(handle, "rsScriptInvoke"),
+        .ScriptInvokeIDCreate = (ScriptInvokeIDCreateFnPtr)dlsym(handle, "rsScriptInvokeIDCreate"),
+        .ScriptInvokeV = (ScriptInvokeVFnPtr)dlsym(handle, "rsScriptInvokeV"),
+        .ScriptKernelIDCreate = (ScriptKernelIDCreateFnPtr)dlsym(handle, "rsScriptKernelIDCreate"),
+        .ScriptReduce = (ScriptReduceFnPtr)dlsym(handle, "rsScriptReduce"),
+        .ScriptSetTimeZone = (ScriptSetTimeZoneFnPtr)dlsym(handle, "rsScriptSetTimeZone"),
+        .ScriptSetVarD = (ScriptSetVarDFnPtr)dlsym(handle, "rsScriptSetVarD"),
+        .ScriptSetVarF = (ScriptSetVarFFnPtr)dlsym(handle, "rsScriptSetVarF"),
+        .ScriptSetVarI = (ScriptSetVarIFnPtr)dlsym(handle, "rsScriptSetVarI"),
+        .ScriptSetVarJ = (ScriptSetVarJFnPtr)dlsym(handle, "rsScriptSetVarJ"),
+        .ScriptSetVarObj = (ScriptSetVarObjFnPtr)dlsym(handle, "rsScriptSetVarObj"),
+        .ScriptSetVarVE = (ScriptSetVarVEFnPtr)dlsym(handle, "rsScriptSetVarVE"),
+        .ScriptSetVarV = (ScriptSetVarVFnPtr)dlsym(handle, "rsScriptSetVarV"),
+        .TypeCreate = (TypeCreateFnPtr)dlsym(handle, "rsTypeCreate"),
+        .TypeGetNativeData = (TypeGetNativeDataFnPtr)dlsym(handle, "rsaTypeGetNativeData"),
+    };
+
+    return dispatchHal;
+}
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace renderscript
+}  // namespace hardware
+}  // namespace android
diff --git a/renderscript/1.0/default/Device.h b/renderscript/1.0/default/Device.h
new file mode 100644
index 0000000..f5bda37
--- /dev/null
+++ b/renderscript/1.0/default/Device.h
@@ -0,0 +1,44 @@
+#ifndef ANDROID_HARDWARE_RENDERSCRIPT_V1_0_DEVICE_H
+#define ANDROID_HARDWARE_RENDERSCRIPT_V1_0_DEVICE_H
+
+#include "cpp/rsDispatch.h"
+#include "dlfcn.h"
+#include <android/hardware/renderscript/1.0/IDevice.h>
+#include <hidl/MQDescriptor.h>
+#include <hidl/Status.h>
+
+namespace android {
+namespace hardware {
+namespace renderscript {
+namespace V1_0 {
+namespace implementation {
+
+using ::android::hardware::renderscript::V1_0::ContextType;
+using ::android::hardware::renderscript::V1_0::IContext;
+using ::android::hardware::renderscript::V1_0::IDevice;
+using ::android::hidl::base::V1_0::IBase;
+using ::android::hardware::Return;
+using ::android::sp;
+
+struct Device : public IDevice {
+    Device();
+    static dispatchTable& getHal();
+
+    // Methods from ::android::hardware::renderscript::V1_0::IDevice follow.
+    Return<sp<IContext>> contextCreate(uint32_t sdkVersion, ContextType ct, int32_t flags) override;
+
+    // Methods from ::android::hidl::base::V1_0::IBase follow.
+
+ private:
+    static dispatchTable mDispatchHal;
+};
+
+extern "C" IDevice* HIDL_FETCH_IDevice(const char* name);
+
+}  // namespace implementation
+}  // namespace V1_0
+}  // namespace renderscript
+}  // namespace hardware
+}  // namespace android
+
+#endif  // ANDROID_HARDWARE_RENDERSCRIPT_V1_0_DEVICE_H
diff --git a/renderscript/1.0/types.hal b/renderscript/1.0/types.hal
new file mode 100644
index 0000000..7c32188
--- /dev/null
+++ b/renderscript/1.0/types.hal
@@ -0,0 +1,253 @@
+/*
+ * 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.
+ */
+
+// TODO: Currently, most of the types are simply typedefs of uint64_t, so
+// misusing one type as another won't be caught by the compiler. Should we wrap
+// each type in a unique class to have stronger type guarantees?
+// TODO: is there an enum for intrinsics?
+
+package android.hardware.renderscript@1.0;
+
+// OpaqueHandle is an object that is used entirely in the driver but still needs
+// to be identified by the framework.
+typedef uint64_t OpaqueHandle;
+
+// A pointer is an actual local pointer that can be accessed by both the
+// framework and the driver. This is possible because RenderScript is always
+// running in Passthrough mode.
+typedef pointer Ptr;
+
+// This is an abstraction of size_t because it is not supported in HIDL.
+typedef uint64_t Size;
+
+// In RenderScript code, these are all defined as void*, but act only as
+// handles.
+typedef OpaqueHandle Allocation;
+typedef OpaqueHandle AllocationAdapter;
+typedef OpaqueHandle Closure;
+typedef OpaqueHandle Element;
+typedef OpaqueHandle NativeWindow;
+typedef OpaqueHandle ObjectBase;
+typedef OpaqueHandle Sampler;
+typedef OpaqueHandle Script;
+typedef OpaqueHandle ScriptFieldID;
+typedef OpaqueHandle ScriptGroup;
+typedef OpaqueHandle ScriptGroup2;
+typedef OpaqueHandle ScriptInvokeID;
+typedef OpaqueHandle ScriptKernelID;
+typedef OpaqueHandle Type;
+
+// types below are same as those in frameworks/rs/rsDefines.h
+
+@export(name="RsContextType", value_prefix="RS_CONTEXT_TYPE_")
+enum ContextType : int32_t {
+    NORMAL,
+    DEBUG,
+    PROFILE,
+};
+
+@export(name="RsAllocationUsageType", value_prefix="RS_ALLOCATION_USAGE_")
+enum AllocationUsageType : int32_t {
+    SCRIPT                 = 0x0001,
+    GRAPHICS_TEXTURE       = 0x0002,
+    GRAPHICS_VERTEX        = 0x0004,
+    GRAPHICS_CONSTANTS     = 0x0008,
+    GRAPHICS_RENDER_TARGET = 0x0010,
+    IO_INPUT               = 0x0020,
+    IO_OUTPUT              = 0x0040,
+    SHARED                 = 0x0080,
+    OEM                    = 0x8000,
+    ALL                    = 0x80FF,
+};
+
+@export(name="RsAllocationMipmapControl", value_prefix="RS_ALLOCATION_MIPMAP_")
+enum AllocationMipmapControl : int32_t {
+    NONE               = 0,
+    FULL               = 1,
+    ON_SYNC_TO_TEXTURE = 2,
+};
+
+@export(name="RsAllocationCubemapFace",
+        value_prefix="RS_ALLOCATION_CUBEMAP_FACE_")
+enum AllocationCubemapFace : int32_t {
+    POSITIVE_X = 0,
+    NEGATIVE_X = 1,
+    POSITIVE_Y = 2,
+    NEGATIVE_Y = 3,
+    POSITIVE_Z = 4,
+    NEGATIVE_Z = 5,
+};
+
+@export(name="RsDataType", value_prefix="RS_TYPE_")
+enum DataType : int32_t {
+    NONE = 0,
+    FLOAT_16,
+    FLOAT_32,
+    FLOAT_64,
+    SIGNED_8,
+    SIGNED_16,
+    SIGNED_32,
+    SIGNED_64,
+    UNSIGNED_8,
+    UNSIGNED_16,
+    UNSIGNED_32,
+    UNSIGNED_64,
+    BOOLEAN,
+    UNSIGNED_5_6_5,
+    UNSIGNED_5_5_5_1,
+    UNSIGNED_4_4_4_4,
+    MATRIX_4X4,
+    MATRIX_3X3,
+    MATRIX_2X2,
+    ELEMENT = 1000,
+    TYPE,
+    ALLOCATION,
+    SAMPLER,
+    SCRIPT,
+    MESH,
+    PROGRAM_FRAGMENT,
+    PROGRAM_VERTEX,
+    PROGRAM_RASTER,
+    PROGRAM_STORE,
+    FONT,
+    INVALID = 10000,
+};
+
+@export(name="RsDataKind", value_prefix="RS_KIND_")
+enum DataKind : int32_t {
+    USER,
+    PIXEL_L = 7,
+    PIXEL_A,
+    PIXEL_LA,
+    PIXEL_RGB,
+    PIXEL_RGBA,
+    PIXEL_DEPTH,
+    PIXEL_YUV,
+    INVALID = 100,
+};
+
+@export(name="RsYuvFormat", value_prefix="RS_")
+enum YuvFormat : int32_t {
+    YUV_NONE    = 0,
+    YUV_YV12    = 0x32315659, // HAL_PIXEL_FORMAT_YV12 in system/graphics.h
+    YUV_NV21    = 0x11,       // HAL_PIXEL_FORMAT_YCrCb_420_SP
+    YUV_420_888 = 0x23,       // HAL_PIXEL_FORMAT_YCbCr_420_888
+};
+
+@export(name="RsSamplerValue", value_prefix="RS_SAMPLER_")
+enum SamplerValue : int32_t {
+    NEAREST,
+    LINEAR,
+    LINEAR_MIP_LINEAR,
+    WRAP,
+    CLAMP,
+    LINEAR_MIP_NEAREST,
+    MIRRORED_REPEAT,
+    INVALID = 100,
+};
+
+@export(name="RsForEachStrategy", value_prefix="RS_FOR_EACH_STRATEGY_")
+enum ForEachStrategy : int32_t {
+    SERIAL      = 0,
+    DONT_CARE   = 1,
+    DST_LINEAR  = 2,
+    TILE_SMALL  = 3,
+    TILE_MEDIUM = 4,
+    TILE_LARGE  = 5,
+};
+
+// Script to Script
+@export(name="RsScriptCall")
+struct ScriptCall {
+    ForEachStrategy strategy;
+    uint32_t        xStart;
+    uint32_t        xEnd;
+    uint32_t        yStart;
+    uint32_t        yEnd;
+    uint32_t        zStart;
+    uint32_t        zEnd;
+    uint32_t        arrayStart;
+    uint32_t        arrayEnd;
+    uint32_t        array2Start;
+    uint32_t        array2End;
+    uint32_t        array3Start;
+    uint32_t        array3End;
+    uint32_t        array4Start;
+    uint32_t        array4End;
+};
+
+@export(name="RsContextFlags", value_prefix="RS_CONTEXT_")
+enum ContextFlags : int32_t {
+    SYNCHRONOUS     = 1<<0,
+    LOW_LATENCY     = 1<<1,
+    LOW_POWER       = 1<<2,
+    WAIT_FOR_ATTACH = 1<<3,
+};
+
+// types below are same as those in frameworks/rs/rsInternalDefines.h
+
+@export(name="RsMessageToClientType", value_prefix="RS_MESSAGE_TO_CLIENT_")
+enum MessageToClientType : int32_t {
+    NONE       = 0,
+    EXCEPTION  = 1,
+    RESIZE     = 2,
+    ERROR      = 3,
+    USER       = 4,
+    NEW_BUFFER = 5,
+};
+
+@export(name="RsScriptIntrinsicID", value_prefix="RS_SCRIPT_INTRINSIC_")
+enum ScriptIntrinsicID : int32_t {
+    ID_UNDEFINED    = 0,
+    ID_CONVOLVE_3X3 = 1,
+    ID_COLOR_MATRIX = 2,
+    ID_LUT          = 3,
+    ID_CONVOLVE_5X5 = 4,
+    ID_BLUR         = 5,
+    ID_YUV_TO_RGB   = 6,
+    ID_BLEND        = 7,
+    ID_3DLUT        = 8,
+    ID_HISTOGRAM    = 9,
+    // unused 10, 11
+    ID_RESIZE       = 12,
+    ID_BLAS         = 13,
+    ID_EXTBLAS      = 14,
+    ID_OEM_START    = 0x10000000,
+};
+
+@export(name="RsThreadPriorities", value_prefix="RS_THREAD_PRIORITY_")
+enum ThreadPriorities : int32_t {
+    LOW             = 15,
+    NORMAL_GRAPHICS = -8,
+    NORMAL          = -1,
+    LOW_LATENCY     = -4,
+};
+
+// types below are same as those in
+// frameworks/compile/libbcc/include/bcinfo/MetadataExtractor.h
+
+@export(name="", value_prefix="RS_MD_")
+enum MetadataSignatureBitval : int32_t {
+    SIG_None        = 0,
+    SIG_In          = 1<<0,
+    SIG_Out         = 1<<1,
+    SIG_Usr         = 1<<2,
+    SIG_X           = 1<<3,
+    SIG_Y           = 1<<4,
+    SIG_Kernel      = 1<<5,
+    SIG_Z           = 1<<6,
+    SIG_Ctxt        = 1<<7,
+};
diff --git a/example/Android.bp b/renderscript/Android.bp
similarity index 66%
rename from example/Android.bp
rename to renderscript/Android.bp
index ea6dbb5..ba90f2c 100644
--- a/example/Android.bp
+++ b/renderscript/Android.bp
@@ -1,4 +1,5 @@
 // This is an autogenerated file, do not edit.
 subdirs = [
-    "extension/light/2.0",
+    "1.0",
+    "1.0/default",
 ]
diff --git a/sensors/1.0/default/convert.cpp b/sensors/1.0/default/convert.cpp
index acff6ca..748a963 100644
--- a/sensors/1.0/default/convert.cpp
+++ b/sensors/1.0/default/convert.cpp
@@ -25,8 +25,8 @@
 namespace implementation {
 
 void convertFromSensor(const sensor_t &src, SensorInfo *dst) {
-    dst->name = src.name;
-    dst->vendor = src.vendor;
+    dst->name = src.name == nullptr ? "" : src.name;
+    dst->vendor = src.vendor == nullptr ? "" : src.vendor;
     dst->version = src.version;
     dst->sensorHandle = src.handle;
     dst->type = (SensorType)src.type;
@@ -36,8 +36,8 @@
     dst->minDelay = src.minDelay;
     dst->fifoReservedEventCount = src.fifoReservedEventCount;
     dst->fifoMaxEventCount = src.fifoMaxEventCount;
-    dst->typeAsString = src.stringType;
-    dst->requiredPermission = src.requiredPermission;
+    dst->typeAsString = src.stringType == nullptr ? "" : src.stringType;
+    dst->requiredPermission = src.requiredPermission == nullptr ? "" : src.requiredPermission;
     dst->maxDelay = src.maxDelay;
     dst->flags = src.flags;
 }
@@ -75,6 +75,10 @@
         case SensorType::META_DATA:
         {
             dst->u.meta.what = (MetaDataEventType)src.meta_data.what;
+            // Legacy HALs contain the handle reference in the meta data field.
+            // Copy that over to the handle of the event. In legacy HALs this
+            // field was expected to be 0.
+            dst->sensorHandle = src.meta_data.sensor;
             break;
         }
 
@@ -212,8 +216,12 @@
   switch (src.sensorType) {
       case SensorType::META_DATA:
       {
+          // Legacy HALs expect the handle reference in the meta data field.
+          // Copy it over from the handle of the event.
           dst->meta_data.what = (int32_t)src.u.meta.what;
-          dst->meta_data.sensor = dst->sensor;
+          dst->meta_data.sensor = src.sensorHandle;
+          // Set the sensor handle to 0 to maintain compatibility.
+          dst->sensor = 0;
           break;
       }
 
diff --git a/sensors/1.0/default/service.cpp b/sensors/1.0/default/service.cpp
index 5bcfe4b..65f6d81 100644
--- a/sensors/1.0/default/service.cpp
+++ b/sensors/1.0/default/service.cpp
@@ -23,5 +23,9 @@
 using android::hardware::defaultPassthroughServiceImplementation;
 
 int main() {
-    return defaultPassthroughServiceImplementation<ISensors>();
+    /* Sensors framework service needs at least two threads.
+     * One thread blocks on a "poll"
+     * The second thread is needed for all other HAL methods.
+     */
+    return defaultPassthroughServiceImplementation<ISensors>(2);
 }
diff --git a/tests/Android.bp b/tests/Android.bp
index 337e4f4..040a6fb 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -4,6 +4,7 @@
     "bar/1.0/default",
     "baz/1.0",
     "expression/1.0",
+    "extension/light/2.0",
     "foo/1.0",
     "foo/1.0/default",
     "foo/1.0/default/lib",
diff --git a/tests/extension/light/2.0/Android.bp b/tests/extension/light/2.0/Android.bp
new file mode 100644
index 0000000..5203da6
--- /dev/null
+++ b/tests/extension/light/2.0/Android.bp
@@ -0,0 +1,62 @@
+// This file is autogenerated by hidl-gen. Do not edit manually.
+
+filegroup {
+    name: "android.hardware.tests.extension.light@2.0_hal",
+    srcs: [
+        "types.hal",
+        "IExtLight.hal",
+    ],
+}
+
+genrule {
+    name: "android.hardware.tests.extension.light@2.0_genc++",
+    tools: ["hidl-gen"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.extension.light@2.0",
+    srcs: [
+        ":android.hardware.tests.extension.light@2.0_hal",
+    ],
+    out: [
+        "android/hardware/tests/extension/light/2.0/types.cpp",
+        "android/hardware/tests/extension/light/2.0/ExtLightAll.cpp",
+    ],
+}
+
+genrule {
+    name: "android.hardware.tests.extension.light@2.0_genc++_headers",
+    tools: ["hidl-gen"],
+    cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.extension.light@2.0",
+    srcs: [
+        ":android.hardware.tests.extension.light@2.0_hal",
+    ],
+    out: [
+        "android/hardware/tests/extension/light/2.0/types.h",
+        "android/hardware/tests/extension/light/2.0/IExtLight.h",
+        "android/hardware/tests/extension/light/2.0/IHwExtLight.h",
+        "android/hardware/tests/extension/light/2.0/BnHwExtLight.h",
+        "android/hardware/tests/extension/light/2.0/BpHwExtLight.h",
+        "android/hardware/tests/extension/light/2.0/BsExtLight.h",
+    ],
+}
+
+cc_library_shared {
+    name: "android.hardware.tests.extension.light@2.0",
+    generated_sources: ["android.hardware.tests.extension.light@2.0_genc++"],
+    generated_headers: ["android.hardware.tests.extension.light@2.0_genc++_headers"],
+    export_generated_headers: ["android.hardware.tests.extension.light@2.0_genc++_headers"],
+    shared_libs: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "liblog",
+        "libutils",
+        "libcutils",
+        "android.hardware.light@2.0",
+    ],
+    export_shared_lib_headers: [
+        "libhidlbase",
+        "libhidltransport",
+        "libhwbinder",
+        "libutils",
+        "android.hardware.light@2.0",
+    ],
+}
diff --git a/example/extension/light/2.0/Android.mk b/tests/extension/light/2.0/Android.mk
similarity index 77%
rename from example/extension/light/2.0/Android.mk
rename to tests/extension/light/2.0/Android.mk
index 0b79747..16424a3 100644
--- a/example/extension/light/2.0/Android.mk
+++ b/tests/extension/light/2.0/Android.mk
@@ -5,7 +5,7 @@
 ################################################################################
 
 include $(CLEAR_VARS)
-LOCAL_MODULE := android.hardware.example.extension.light@2.0-java
+LOCAL_MODULE := android.hardware.tests.extension.light@2.0-java
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
 intermediates := $(call local-generated-sources-dir, COMMON)
@@ -20,7 +20,7 @@
 #
 # Build types.hal (Default)
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/Default.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/Default.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
@@ -30,7 +30,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::types.Default
+        android.hardware.tests.extension.light@2.0::types.Default
 
 $(GEN): $(LOCAL_PATH)/types.hal
 	$(transform-generated-source)
@@ -39,7 +39,7 @@
 #
 # Build types.hal (ExtBrightness)
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/ExtBrightness.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtBrightness.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
@@ -49,7 +49,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::types.ExtBrightness
+        android.hardware.tests.extension.light@2.0::types.ExtBrightness
 
 $(GEN): $(LOCAL_PATH)/types.hal
 	$(transform-generated-source)
@@ -58,7 +58,7 @@
 #
 # Build types.hal (ExtLightState)
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/ExtLightState.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtLightState.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
@@ -68,7 +68,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::types.ExtLightState
+        android.hardware.tests.extension.light@2.0::types.ExtLightState
 
 $(GEN): $(LOCAL_PATH)/types.hal
 	$(transform-generated-source)
@@ -77,7 +77,7 @@
 #
 # Build IExtLight.hal
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/IExtLight.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/IExtLight.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal
@@ -89,7 +89,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::IExtLight
+        android.hardware.tests.extension.light@2.0::IExtLight
 
 $(GEN): $(LOCAL_PATH)/IExtLight.hal
 	$(transform-generated-source)
@@ -100,7 +100,7 @@
 ################################################################################
 
 include $(CLEAR_VARS)
-LOCAL_MODULE := android.hardware.example.extension.light@2.0-java-static
+LOCAL_MODULE := android.hardware.tests.extension.light@2.0-java-static
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
 intermediates := $(call local-generated-sources-dir, COMMON)
@@ -115,7 +115,7 @@
 #
 # Build types.hal (Default)
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/Default.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/Default.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
@@ -125,7 +125,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::types.Default
+        android.hardware.tests.extension.light@2.0::types.Default
 
 $(GEN): $(LOCAL_PATH)/types.hal
 	$(transform-generated-source)
@@ -134,7 +134,7 @@
 #
 # Build types.hal (ExtBrightness)
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/ExtBrightness.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtBrightness.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
@@ -144,7 +144,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::types.ExtBrightness
+        android.hardware.tests.extension.light@2.0::types.ExtBrightness
 
 $(GEN): $(LOCAL_PATH)/types.hal
 	$(transform-generated-source)
@@ -153,7 +153,7 @@
 #
 # Build types.hal (ExtLightState)
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/ExtLightState.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/ExtLightState.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/types.hal
@@ -163,7 +163,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::types.ExtLightState
+        android.hardware.tests.extension.light@2.0::types.ExtLightState
 
 $(GEN): $(LOCAL_PATH)/types.hal
 	$(transform-generated-source)
@@ -172,7 +172,7 @@
 #
 # Build IExtLight.hal
 #
-GEN := $(intermediates)/android/hardware/example/extension/light/V2_0/IExtLight.java
+GEN := $(intermediates)/android/hardware/tests/extension/light/V2_0/IExtLight.java
 $(GEN): $(HIDL)
 $(GEN): PRIVATE_HIDL := $(HIDL)
 $(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IExtLight.hal
@@ -184,7 +184,7 @@
         -Ljava \
         -randroid.hardware:hardware/interfaces \
         -randroid.hidl:system/libhidl/transport \
-        android.hardware.example.extension.light@2.0::IExtLight
+        android.hardware.tests.extension.light@2.0::IExtLight
 
 $(GEN): $(LOCAL_PATH)/IExtLight.hal
 	$(transform-generated-source)
diff --git a/example/extension/light/2.0/IExtLight.hal b/tests/extension/light/2.0/IExtLight.hal
similarity index 95%
rename from example/extension/light/2.0/IExtLight.hal
rename to tests/extension/light/2.0/IExtLight.hal
index f12a272..1515b86 100644
--- a/example/extension/light/2.0/IExtLight.hal
+++ b/tests/extension/light/2.0/IExtLight.hal
@@ -17,7 +17,7 @@
 // Would normally be 'vendor.example.extension.light@2.0' however, this is
 // a google extension example. A vendor extension should also live in the
 // vendor partition.
-package android.hardware.example.extension.light@2.0;
+package android.hardware.tests.extension.light@2.0;
 
 import android.hardware.light@2.0;
 
diff --git a/tests/extension/light/2.0/default/Android.mk b/tests/extension/light/2.0/default/Android.mk
new file mode 100644
index 0000000..4dee3ee
--- /dev/null
+++ b/tests/extension/light/2.0/default/Android.mk
@@ -0,0 +1,20 @@
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.tests.extension.light@2.0-service
+LOCAL_INIT_RC := android.hardware.tests.extension.light@2.0-service.rc
+LOCAL_PROPRIETARY_MODULE := true
+LOCAL_MODULE_RELATIVE_PATH := hw
+LOCAL_SRC_FILES := \
+    Light.cpp \
+    service.cpp
+
+LOCAL_SHARED_LIBRARIES := \
+    libhidlbase \
+    libhidltransport \
+    libhwbinder \
+    libutils \
+    android.hardware.light@2.0 \
+    android.hardware.tests.extension.light@2.0 \
+
+include $(BUILD_EXECUTABLE)
diff --git a/example/extension/light/2.0/default/Light.cpp b/tests/extension/light/2.0/default/Light.cpp
similarity index 97%
rename from example/extension/light/2.0/default/Light.cpp
rename to tests/extension/light/2.0/default/Light.cpp
index 2e56319..d941e73 100644
--- a/example/extension/light/2.0/default/Light.cpp
+++ b/tests/extension/light/2.0/default/Light.cpp
@@ -17,7 +17,7 @@
 
 namespace android {
 namespace hardware {
-namespace example {
+namespace tests {
 namespace extension {
 namespace light {
 namespace V2_0 {
@@ -66,6 +66,6 @@
 }  // namespace V2_0
 }  // namespace light
 }  // namespace extension
-}  // namespace example
+}  // namespace tests
 }  // namespace hardware
 }  // namespace android
diff --git a/example/extension/light/2.0/default/Light.h b/tests/extension/light/2.0/default/Light.h
similarity index 79%
rename from example/extension/light/2.0/default/Light.h
rename to tests/extension/light/2.0/default/Light.h
index e3b60df..dc2c5dd 100644
--- a/example/extension/light/2.0/default/Light.h
+++ b/tests/extension/light/2.0/default/Light.h
@@ -13,23 +13,23 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#ifndef ANDROID_HARDWARE_EXAMPLE_EXTENSION_LIGHT_V2_0_LIGHT_H
-#define ANDROID_HARDWARE_EXAMPLE_EXTENSION_LIGHT_V2_0_LIGHT_H
+#ifndef ANDROID_HARDWARE_TESTS_EXTENSION_LIGHT_V2_0_LIGHT_H
+#define ANDROID_HARDWARE_TESTS_EXTENSION_LIGHT_V2_0_LIGHT_H
 
-#include <android/hardware/example/extension/light/2.0/IExtLight.h>
+#include <android/hardware/tests/extension/light/2.0/IExtLight.h>
 #include <hidl/Status.h>
 
 #include <hidl/MQDescriptor.h>
 namespace android {
 namespace hardware {
-namespace example {
+namespace tests {
 namespace extension {
 namespace light {
 namespace V2_0 {
 namespace implementation {
 
-using ::android::hardware::example::extension::light::V2_0::ExtLightState;
-using ::android::hardware::example::extension::light::V2_0::IExtLight;
+using ::android::hardware::tests::extension::light::V2_0::ExtLightState;
+using ::android::hardware::tests::extension::light::V2_0::IExtLight;
 using ::android::hardware::light::V2_0::ILight;
 using ::android::hardware::light::V2_0::LightState;
 using ::android::hardware::light::V2_0::Status;
@@ -54,8 +54,8 @@
 }  // namespace V2_0
 }  // namespace light
 }  // namespace extension
-}  // namespace example
+}  // namespace tests
 }  // namespace hardware
 }  // namespace android
 
-#endif  // ANDROID_HARDWARE_EXAMPLE_EXTENSION_LIGHT_V2_0_LIGHT_H
+#endif  // ANDROID_HARDWARE_TESTS_EXTENSION_LIGHT_V2_0_LIGHT_H
diff --git a/tests/extension/light/2.0/default/android.hardware.tests.extension.light@2.0-service.rc b/tests/extension/light/2.0/default/android.hardware.tests.extension.light@2.0-service.rc
new file mode 100644
index 0000000..8f379ee
--- /dev/null
+++ b/tests/extension/light/2.0/default/android.hardware.tests.extension.light@2.0-service.rc
@@ -0,0 +1,4 @@
+service light-ext-2-0 /vendor/bin/hw/android.hardware.tests.extension.light@2.0-service
+    class hal
+    user system
+    group system
\ No newline at end of file
diff --git a/example/extension/light/2.0/default/service.cpp b/tests/extension/light/2.0/default/service.cpp
similarity index 87%
rename from example/extension/light/2.0/default/service.cpp
rename to tests/extension/light/2.0/default/service.cpp
index 07afe79..4d839b2 100644
--- a/example/extension/light/2.0/default/service.cpp
+++ b/tests/extension/light/2.0/default/service.cpp
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-#define LOG_TAG "android.hardware.light@2.0-service"
+#define LOG_TAG "android.hardware.tests.extension.light@2.0-service"
 
 #include <android/log.h>
 #include <hidl/HidlTransportSupport.h>
@@ -24,8 +24,8 @@
 using android::hardware::joinRpcThreadpool;
 using android::sp;
 
-// Generated HIDL files
 using android::hardware::light::V2_0::ILight;
+using android::hardware::tests::extension::light::V2_0::implementation::Light;
 
 int main() {
     android::sp<ILight> service = new Light();
diff --git a/example/extension/light/2.0/types.hal b/tests/extension/light/2.0/types.hal
similarity index 97%
rename from example/extension/light/2.0/types.hal
rename to tests/extension/light/2.0/types.hal
index 5be41bb..1b09479 100644
--- a/example/extension/light/2.0/types.hal
+++ b/tests/extension/light/2.0/types.hal
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package android.hardware.example.extension.light@2.0;
+package android.hardware.tests.extension.light@2.0;
 
 import android.hardware.light@2.0;
 
diff --git a/tests/msgq/1.0/ITestMsgQ.hal b/tests/msgq/1.0/ITestMsgQ.hal
index 3ed1b37..dfb9be4 100644
--- a/tests/msgq/1.0/ITestMsgQ.hal
+++ b/tests/msgq/1.0/ITestMsgQ.hal
@@ -34,15 +34,19 @@
         generates(bool ret, fmq_sync<uint16_t> mqDesc);
 
     /*
-     * This method requests the service to set up an unsynchronized write
-     * wait-free FMQ with the client as reader.
+     * This method requests the service to return an MQDescriptor to
+     * an unsynchronized FMQ set up by the server. If 'configureFmq' is
+     * true, then the server sets up a new unsynchronized FMQ. This
+     * method is to be used to test multiple reader processes.
      *
-     * @return ret True if the setup is successful.
-     * @return mqDesc This structure describes the FMQ that was
+     * @param configureFmq The server sets up a new unsynchronized FMQ if
+     * this parameter is true.
+     *
+     * @return ret True if successful.
+     * @return mqDesc This structure describes the unsynchronized FMQ that was
      * set up by the service. Client can use it to set up the FMQ at its end.
      */
-    configureFmqUnsyncWrite()
-        generates(bool ret, fmq_unsync<uint16_t> mqDesc);
+    getFmqUnsyncWrite(bool configureFmq) generates(bool ret, fmq_unsync<uint16_t> mqDesc);
 
     /*
      * This method request the service to write into the synchronized read/write
diff --git a/tests/versioning/1.0/Android.bp b/tests/versioning/1.0/Android.bp
index fd331f2..fbabc10 100644
--- a/tests/versioning/1.0/Android.bp
+++ b/tests/versioning/1.0/Android.bp
@@ -12,7 +12,7 @@
     tools: ["hidl-gen"],
     cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.versioning@1.0",
     srcs: [
-        "IFoo.hal",
+        ":android.hardware.tests.versioning@1.0_hal",
     ],
     out: [
         "android/hardware/tests/versioning/1.0/FooAll.cpp",
@@ -24,7 +24,7 @@
     tools: ["hidl-gen"],
     cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.versioning@1.0",
     srcs: [
-        "IFoo.hal",
+        ":android.hardware.tests.versioning@1.0_hal",
     ],
     out: [
         "android/hardware/tests/versioning/1.0/IFoo.h",
diff --git a/tests/versioning/1.0/Android.mk b/tests/versioning/1.0/Android.mk
index 753ad0c..ba18384 100644
--- a/tests/versioning/1.0/Android.mk
+++ b/tests/versioning/1.0/Android.mk
@@ -8,7 +8,7 @@
 LOCAL_MODULE := android.hardware.tests.versioning@1.0-java
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
-intermediates := $(local-generated-sources-dir)
+intermediates := $(call local-generated-sources-dir, COMMON)
 
 HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
 
@@ -43,7 +43,7 @@
 LOCAL_MODULE := android.hardware.tests.versioning@1.0-java-static
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
-intermediates := $(local-generated-sources-dir)
+intermediates := $(call local-generated-sources-dir, COMMON)
 
 HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
 
diff --git a/tests/versioning/2.2/Android.bp b/tests/versioning/2.2/Android.bp
index 5e90105..953b6df 100644
--- a/tests/versioning/2.2/Android.bp
+++ b/tests/versioning/2.2/Android.bp
@@ -13,8 +13,7 @@
     tools: ["hidl-gen"],
     cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.versioning@2.2",
     srcs: [
-        "IBar.hal",
-        "IFoo.hal",
+        ":android.hardware.tests.versioning@2.2_hal",
     ],
     out: [
         "android/hardware/tests/versioning/2.2/BarAll.cpp",
@@ -27,8 +26,7 @@
     tools: ["hidl-gen"],
     cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.versioning@2.2",
     srcs: [
-        "IBar.hal",
-        "IFoo.hal",
+        ":android.hardware.tests.versioning@2.2_hal",
     ],
     out: [
         "android/hardware/tests/versioning/2.2/IBar.h",
diff --git a/tests/versioning/2.2/Android.mk b/tests/versioning/2.2/Android.mk
index 6376652..e2a2ff7 100644
--- a/tests/versioning/2.2/Android.mk
+++ b/tests/versioning/2.2/Android.mk
@@ -8,7 +8,7 @@
 LOCAL_MODULE := android.hardware.tests.versioning@2.2-java
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
-intermediates := $(local-generated-sources-dir)
+intermediates := $(call local-generated-sources-dir, COMMON)
 
 HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
 
@@ -62,7 +62,7 @@
 LOCAL_MODULE := android.hardware.tests.versioning@2.2-java-static
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
-intermediates := $(local-generated-sources-dir)
+intermediates := $(call local-generated-sources-dir, COMMON)
 
 HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
 
diff --git a/tests/versioning/2.3/Android.bp b/tests/versioning/2.3/Android.bp
index 1489539..3cc2076 100644
--- a/tests/versioning/2.3/Android.bp
+++ b/tests/versioning/2.3/Android.bp
@@ -4,6 +4,7 @@
     name: "android.hardware.tests.versioning@2.3_hal",
     srcs: [
         "IBar.hal",
+        "IBaz.hal",
         "IFoo.hal",
     ],
 }
@@ -13,11 +14,11 @@
     tools: ["hidl-gen"],
     cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.versioning@2.3",
     srcs: [
-        "IBar.hal",
-        "IFoo.hal",
+        ":android.hardware.tests.versioning@2.3_hal",
     ],
     out: [
         "android/hardware/tests/versioning/2.3/BarAll.cpp",
+        "android/hardware/tests/versioning/2.3/BazAll.cpp",
         "android/hardware/tests/versioning/2.3/FooAll.cpp",
     ],
 }
@@ -27,8 +28,7 @@
     tools: ["hidl-gen"],
     cmd: "$(location hidl-gen) -o $(genDir) -Lc++ -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport android.hardware.tests.versioning@2.3",
     srcs: [
-        "IBar.hal",
-        "IFoo.hal",
+        ":android.hardware.tests.versioning@2.3_hal",
     ],
     out: [
         "android/hardware/tests/versioning/2.3/IBar.h",
@@ -36,6 +36,11 @@
         "android/hardware/tests/versioning/2.3/BnHwBar.h",
         "android/hardware/tests/versioning/2.3/BpHwBar.h",
         "android/hardware/tests/versioning/2.3/BsBar.h",
+        "android/hardware/tests/versioning/2.3/IBaz.h",
+        "android/hardware/tests/versioning/2.3/IHwBaz.h",
+        "android/hardware/tests/versioning/2.3/BnHwBaz.h",
+        "android/hardware/tests/versioning/2.3/BpHwBaz.h",
+        "android/hardware/tests/versioning/2.3/BsBaz.h",
         "android/hardware/tests/versioning/2.3/IFoo.h",
         "android/hardware/tests/versioning/2.3/IHwFoo.h",
         "android/hardware/tests/versioning/2.3/BnHwFoo.h",
@@ -56,13 +61,17 @@
         "liblog",
         "libutils",
         "libcutils",
+        "android.hardware.tests.versioning@1.0",
         "android.hardware.tests.versioning@2.2",
+        "android.hidl.base@1.0",
     ],
     export_shared_lib_headers: [
         "libhidlbase",
         "libhidltransport",
         "libhwbinder",
         "libutils",
+        "android.hardware.tests.versioning@1.0",
         "android.hardware.tests.versioning@2.2",
+        "android.hidl.base@1.0",
     ],
 }
diff --git a/tests/versioning/2.3/Android.mk b/tests/versioning/2.3/Android.mk
index 5b05152..68e6be4 100644
--- a/tests/versioning/2.3/Android.mk
+++ b/tests/versioning/2.3/Android.mk
@@ -8,11 +8,12 @@
 LOCAL_MODULE := android.hardware.tests.versioning@2.3-java
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
-intermediates := $(local-generated-sources-dir)
+intermediates := $(call local-generated-sources-dir, COMMON)
 
 HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
 
 LOCAL_JAVA_LIBRARIES := \
+    android.hardware.tests.versioning@1.0-java \
     android.hardware.tests.versioning@2.2-java \
     android.hidl.base@1.0-java \
 
@@ -37,6 +38,25 @@
 LOCAL_GENERATED_SOURCES += $(GEN)
 
 #
+# Build IBaz.hal
+#
+GEN := $(intermediates)/android/hardware/tests/versioning/V2_3/IBaz.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBaz.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.tests.versioning@2.3::IBaz
+
+$(GEN): $(LOCAL_PATH)/IBaz.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
 # Build IFoo.hal
 #
 GEN := $(intermediates)/android/hardware/tests/versioning/V2_3/IFoo.java
@@ -63,11 +83,12 @@
 LOCAL_MODULE := android.hardware.tests.versioning@2.3-java-static
 LOCAL_MODULE_CLASS := JAVA_LIBRARIES
 
-intermediates := $(local-generated-sources-dir)
+intermediates := $(call local-generated-sources-dir, COMMON)
 
 HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
 
 LOCAL_STATIC_JAVA_LIBRARIES := \
+    android.hardware.tests.versioning@1.0-java-static \
     android.hardware.tests.versioning@2.2-java-static \
     android.hidl.base@1.0-java-static \
 
@@ -92,6 +113,25 @@
 LOCAL_GENERATED_SOURCES += $(GEN)
 
 #
+# Build IBaz.hal
+#
+GEN := $(intermediates)/android/hardware/tests/versioning/V2_3/IBaz.java
+$(GEN): $(HIDL)
+$(GEN): PRIVATE_HIDL := $(HIDL)
+$(GEN): PRIVATE_DEPS := $(LOCAL_PATH)/IBaz.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.tests.versioning@2.3::IBaz
+
+$(GEN): $(LOCAL_PATH)/IBaz.hal
+	$(transform-generated-source)
+LOCAL_GENERATED_SOURCES += $(GEN)
+
+#
 # Build IFoo.hal
 #
 GEN := $(intermediates)/android/hardware/tests/versioning/V2_3/IFoo.java
diff --git a/tests/versioning/2.3/IBar.hal b/tests/versioning/2.3/IBar.hal
index 946d42e..fe38e76 100644
--- a/tests/versioning/2.3/IBar.hal
+++ b/tests/versioning/2.3/IBar.hal
@@ -18,7 +18,7 @@
 
 import @2.2::IBar;
 
-// Must extend @2.3::IBar.
+// Must extend @2.2::IBar.
 interface IBar extends @2.2::IBar {
 
 };
diff --git a/tests/versioning/2.3/IBaz.hal b/tests/versioning/2.3/IBaz.hal
new file mode 100644
index 0000000..e28792c
--- /dev/null
+++ b/tests/versioning/2.3/IBaz.hal
@@ -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.
+ */
+
+package android.hardware.tests.versioning@2.3;
+
+import @1.0::IFoo;
+
+interface IBaz extends @1.0::IFoo {
+
+};
diff --git a/tests/versioning/2.3/IFoo.hal b/tests/versioning/2.3/IFoo.hal
index c450dd2..2c76500 100644
--- a/tests/versioning/2.3/IFoo.hal
+++ b/tests/versioning/2.3/IFoo.hal
@@ -18,7 +18,7 @@
 
 import @2.2::IFoo;
 
-// Must extend @2.3::IFoo.
+// Must extend @2.2::IFoo.
 interface IFoo extends @2.2::IFoo {
 
 };
diff --git a/thermal/1.0/vts/functional/Android.bp b/thermal/1.0/vts/functional/Android.bp
index bef7bc2..fedb760 100644
--- a/thermal/1.0/vts/functional/Android.bp
+++ b/thermal/1.0/vts/functional/Android.bp
@@ -31,12 +31,8 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
     ],
-    ldflags: [
-        "--coverage"
-    ]
 }
 
diff --git a/tv/input/1.0/vts/functional/Android.bp b/tv/input/1.0/vts/functional/Android.bp
index 979eb99..c327733 100644
--- a/tv/input/1.0/vts/functional/Android.bp
+++ b/tv/input/1.0/vts/functional/Android.bp
@@ -31,13 +31,8 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-// TODO: add --coverage when the segfault issue is fixed.
-//        "--coverage",
         "-O0",
         "-g",
-    ],
-//    ldflags: [
-//        "--coverage"
-//    ]
+    ]
 }
 
diff --git a/vr/1.0/vts/functional/Android.bp b/vr/1.0/vts/functional/Android.bp
index 551f27c..529f92d 100644
--- a/vr/1.0/vts/functional/Android.bp
+++ b/vr/1.0/vts/functional/Android.bp
@@ -26,11 +26,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-       "--coverage",
        "-O0",
         "-g",
-    ],
-    ldflags: [
-        "--coverage"
     ]
 }
diff --git a/wifi/.clang-format b/wifi/.clang-format
new file mode 100644
index 0000000..25ed932
--- /dev/null
+++ b/wifi/.clang-format
@@ -0,0 +1,2 @@
+BasedOnStyle: Google
+IndentWidth: 4
\ No newline at end of file
diff --git a/wifi/1.0/types.hal b/wifi/1.0/types.hal
index f777207..1c6d0e0 100644
--- a/wifi/1.0/types.hal
+++ b/wifi/1.0/types.hal
@@ -715,8 +715,8 @@
     * Value of 0:
     *  - reserved in 2.4GHz band
     *  - no wakeup at all in 5GHz band
-    * The publish/subscribe period values don't override the device level configurations if
-    * specified.
+    * The publish/subscribe period values don't override this device level configurations if
+    * it is specified.
     * Configuration is only used only if |validDiscoveryWindowIntervalVal| is set to true.
     * NAN Spec: Device Capability Attribute / 2.4 GHz DW, Device Capability Attribute / 5 GHz DW
     */
@@ -915,8 +915,8 @@
   /**
    * Indicates the interval between two Discovery Windows in which the device supporting the
    * service is awake to transmit or receive the Service Discovery frames. Valid values of Awake
-   * DW Interval are: 1, 2, 4, 8 and 16. A value of 0 will default to 1. Overrides any
-   * |NanBandSpecificConfig.discoveryWindowIntervalVal| configurations.
+   * DW Interval are: 1, 2, 4, 8 and 16. A value of 0 will default to 1. Does not override
+   * |NanBandSpecificConfig.discoveryWindowIntervalVal| configurations if those are specified.
    */
   uint16_t discoveryWindowPeriod;
   /**
diff --git a/wifi/1.0/vts/functional/Android.bp b/wifi/1.0/vts/functional/Android.bp
index 422eec5..8a5d7e0 100644
--- a/wifi/1.0/vts/functional/Android.bp
+++ b/wifi/1.0/vts/functional/Android.bp
@@ -21,6 +21,7 @@
         "main.cpp",
         "wifi_ap_iface_hidl_test.cpp",
         "wifi_chip_hidl_test.cpp",
+        "wifi_hidl_call_util_selftest.cpp",
         "wifi_hidl_test.cpp",
         "wifi_hidl_test_utils.cpp",
         "wifi_nan_iface_hidl_test.cpp",
@@ -40,11 +41,7 @@
     ],
     static_libs: ["libgtest"],
     cflags: [
-        "--coverage",
         "-O0",
         "-g",
     ],
-    ldflags: [
-        "--coverage"
-    ]
 }
diff --git a/wifi/1.0/vts/functional/wifi_hidl_call_util.h b/wifi/1.0/vts/functional/wifi_hidl_call_util.h
new file mode 100644
index 0000000..03200a0
--- /dev/null
+++ b/wifi/1.0/vts/functional/wifi_hidl_call_util.h
@@ -0,0 +1,123 @@
+/*
+ * 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.
+ */
+
+#pragma once
+
+#include <functional>
+#include <tuple>
+#include <type_traits>
+#include <utility>
+
+#include <gtest/gtest.h>
+
+namespace {
+namespace detail {
+template <typename>
+struct functionArgSaver;
+
+// Provides a std::function that takes one argument, and a buffer
+// wherein the function will store its argument. The buffer has
+// the same type as the argument, but with const and reference
+// modifiers removed.
+template <typename ArgT>
+struct functionArgSaver<std::function<void(ArgT)>> final {
+    using StorageT = typename std::remove_const<
+        typename std::remove_reference<ArgT>::type>::type;
+
+    std::function<void(ArgT)> saveArgs = [this](ArgT arg) {
+        this->saved_values = arg;
+    };
+
+    StorageT saved_values;
+};
+
+// Provides a std::function that takes two arguments, and a buffer
+// wherein the function will store its arguments. The buffer is a
+// std::pair, whose elements have the same types as the arguments
+// (but with const and reference modifiers removed).
+template <typename Arg1T, typename Arg2T>
+struct functionArgSaver<std::function<void(Arg1T, Arg2T)>> final {
+    using StorageT =
+        std::pair<typename std::remove_const<
+                      typename std::remove_reference<Arg1T>::type>::type,
+                  typename std::remove_const<
+                      typename std::remove_reference<Arg2T>::type>::type>;
+
+    std::function<void(Arg1T, Arg2T)> saveArgs = [this](Arg1T arg1,
+                                                        Arg2T arg2) {
+        this->saved_values = {arg1, arg2};
+    };
+
+    StorageT saved_values;
+};
+
+// Provides a std::function that takes three or more arguments, and a
+// buffer wherein the function will store its arguments. The buffer is a
+// std::tuple whose elements have the same types as the arguments (but
+// with const and reference modifiers removed).
+template <typename... ArgT>
+struct functionArgSaver<std::function<void(ArgT...)>> final {
+    using StorageT = std::tuple<typename std::remove_const<
+        typename std::remove_reference<ArgT>::type>::type...>;
+
+    std::function<void(ArgT...)> saveArgs = [this](ArgT... arg) {
+        this->saved_values = {arg...};
+    };
+
+    StorageT saved_values;
+};
+
+// Invokes |method| on |object|, providing |method| a CallbackT as the
+// final argument. Returns a copy of the parameters that |method| provided
+// to CallbackT. (The parameters are returned by value.)
+template <typename CallbackT, typename MethodT, typename ObjectT,
+          typename... ArgT>
+typename functionArgSaver<CallbackT>::StorageT invokeMethod(
+    MethodT method, ObjectT object, ArgT&&... methodArg) {
+    functionArgSaver<CallbackT> result_buffer;
+    const auto& res = ((*object).*method)(std::forward<ArgT>(methodArg)...,
+                                          result_buffer.saveArgs);
+    EXPECT_TRUE(res.isOk());
+    return result_buffer.saved_values;
+}
+}  // namespace detail
+}  // namespace
+
+// Invokes |method| on |strong_pointer|, passing provided arguments through to
+// |method|.
+//
+// Returns either:
+// - A copy of the result callback parameter (for callbacks with a single
+//   parameter), OR
+// - A pair containing a copy of the result callback parameters (for callbacks
+//   with two parameters), OR
+// - A tuple containing a copy of the result callback paramters (for callbacks
+//   with three or more parameters).
+//
+// Example usage:
+//   EXPECT_EQ(WifiStatusCode::SUCCESS,
+//       HIDL_INVOKE(strong_pointer, methodReturningWifiStatus).code);
+//   EXPECT_EQ(WifiStatusCode::SUCCESS,
+//       HIDL_INVOKE(strong_pointer, methodReturningWifiStatusAndOneMore)
+//         .first.code);
+//   EXPECT_EQ(WifiStatusCode::SUCCESS, std::get<0>(
+//       HIDL_INVOKE(strong_pointer, methodReturningWifiStatusAndTwoMore))
+//         .code);
+#define HIDL_INVOKE(strong_pointer, method, ...)                              \
+    (detail::invokeMethod<                                                    \
+        std::remove_reference<decltype(*strong_pointer)>::type::method##_cb>( \
+        &std::remove_reference<decltype(*strong_pointer)>::type::method,      \
+        strong_pointer, ##__VA_ARGS__))
diff --git a/wifi/1.0/vts/functional/wifi_hidl_call_util_selftest.cpp b/wifi/1.0/vts/functional/wifi_hidl_call_util_selftest.cpp
new file mode 100644
index 0000000..129bdb2
--- /dev/null
+++ b/wifi/1.0/vts/functional/wifi_hidl_call_util_selftest.cpp
@@ -0,0 +1,114 @@
+/*
+ * 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.
+ */
+
+#include <functional>
+#include <type_traits>
+
+#include <hidl/Status.h>
+#include <utils/RefBase.h>
+#include <utils/StrongPointer.h>
+
+#include "wifi_hidl_call_util.h"
+
+namespace {
+/*
+ * Example of a user-defined data-type.
+ *
+ * Used to verify that, within the internals of HIDL_INVOKE,
+ * reference parameters are stored by copy.
+ */
+class Dummy {};
+
+/*
+ * Example of what a HIDL-generated proxy might look like.
+ */
+class IExample : public ::android::RefBase {
+   public:
+    // The callback type, for a method called startWithCallbackCopy, which
+    // has a callback that takes an |int|. Both the name, and the value,
+    // must match what would appear in HIDL-generated code.
+    using startWithCallbackCopy_cb = std::function<void(int)>;
+
+    // The callback type, for a method called startWithCallbackReference, which
+    // has a callback that takes an |int|. Both the name, and the value,
+    // must match what would appear in HIDL-generated code.
+    using startWithCallbackReference_cb = std::function<void(int)>;
+
+    // Constants which allow tests to verify that the proxy methods can
+    // correctly return a value. We use different values for by-copy and
+    // by-reference, to double-check that a call was dispatched properly.
+    static constexpr int kByCopyResult = 42;
+    static constexpr int kByReferenceResult = 420;
+
+    // Example of what a no-arg method would look like, if the callback
+    // is passed by-value.
+    ::android::hardware::Return<void> startWithCallbackCopy(
+        startWithCallbackCopy_cb _hidl_cb) {
+        _hidl_cb(kByCopyResult);
+        return ::android::hardware::Void();
+    }
+    // Example of what a no-arg method would look like, if the callback
+    // is passed by const-reference.
+    ::android::hardware::Return<void> startWithCallbackReference(
+        const startWithCallbackReference_cb& _hidl_cb) {
+        _hidl_cb(kByReferenceResult);
+        return ::android::hardware::Void();
+    }
+};
+
+constexpr int IExample::kByCopyResult;
+constexpr int IExample::kByReferenceResult;
+}  // namespace
+
+static_assert(std::is_same<int, detail::functionArgSaver<
+                                    std::function<void(int)>>::StorageT>::value,
+              "Single-arg result should be stored directly.");
+
+static_assert(
+    std::is_same<std::pair<int, long>, detail::functionArgSaver<std::function<
+                                           void(int, long)>>::StorageT>::value,
+    "Two-arg result should be stored as a pair.");
+
+static_assert(
+    std::is_same<std::tuple<char, int, long>,
+                 detail::functionArgSaver<
+                     std::function<void(char, int, long)>>::StorageT>::value,
+    "Three-arg result should be stored as a tuple.");
+
+static_assert(std::is_same<Dummy, detail::functionArgSaver<std::function<
+                                      void(const Dummy&)>>::StorageT>::value,
+              "Reference should be stored by copy.");
+
+/*
+ * Verifies that HIDL_INVOKE can be used with methods that take the result
+ * callback as a by-value parameter. (This reflects the current implementation
+ * of HIDL-generated code.)
+ */
+TEST(HidlInvokeTest, WorksWithMethodThatTakesResultCallbackByValue) {
+    ::android::sp<IExample> sp = new IExample();
+    EXPECT_EQ(IExample::kByCopyResult, HIDL_INVOKE(sp, startWithCallbackCopy));
+}
+
+/*
+ * Verifies that HIDL_INVOKE can be used with methods that take the result
+ * callback as a const-reference parameter. (This ensures that HIDL_INVOKE will
+ * continue to work, if the HIDL-generated code switches to const-ref.)
+ */
+TEST(HidlInvokeTest, WorksWithMethodThatTakesResultCallbackByConstReference) {
+    ::android::sp<IExample> sp = new IExample();
+    EXPECT_EQ(IExample::kByReferenceResult,
+              HIDL_INVOKE(sp, startWithCallbackReference));
+}
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 050bba3..8f34a88 100644
--- a/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
+++ b/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
@@ -16,6 +16,7 @@
 
 #include <gtest/gtest.h>
 
+#include "wifi_hidl_call_util.h"
 #include "wifi_hidl_test_utils.h"
 
 using ::android::hardware::wifi::V1_0::IWifi;
@@ -52,41 +53,23 @@
         return nullptr;
     }
 
-    bool operation_failed = false;
-    wifi->start([&](WifiStatus status) {
-        if (status.code != WifiStatusCode::SUCCESS) {
-            operation_failed = true;
-        }
-    });
-    if (operation_failed) {
+    if (HIDL_INVOKE(wifi, start).code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
 
-    std::vector<ChipId> wifi_chip_ids;
-    wifi->getChipIds(
-        [&](const WifiStatus& status, const hidl_vec<ChipId>& chip_ids) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            wifi_chip_ids = chip_ids;
-        });
-    // We don't expect more than 1 chip currently.
-    if (operation_failed || wifi_chip_ids.size() != 1) {
+    const auto& status_and_chip_ids = HIDL_INVOKE(wifi, getChipIds);
+    const auto& chip_ids = status_and_chip_ids.second;
+    if (status_and_chip_ids.first.code != WifiStatusCode::SUCCESS ||
+        chip_ids.size() != 1) {
         return nullptr;
     }
 
-    sp<IWifiChip> wifi_chip;
-    wifi->getChip(wifi_chip_ids[0],
-                  [&](const WifiStatus& status, const sp<IWifiChip>& chip) {
-                      if (status.code != WifiStatusCode::SUCCESS) {
-                          operation_failed = true;
-                      }
-                      wifi_chip = chip;
-                  });
-    if (operation_failed) {
+    const auto& status_and_chip = HIDL_INVOKE(wifi, getChip, chip_ids[0]);
+    if (status_and_chip.first.code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
-    return wifi_chip;
+
+    return status_and_chip.second;
 }
 
 // Since we currently only support one iface of each type. Just iterate thru the
@@ -116,30 +99,18 @@
 
 bool configureChipToSupportIfaceType(const sp<IWifiChip>& wifi_chip,
                                      IfaceType type) {
-    bool operation_failed = false;
-    std::vector<IWifiChip::ChipMode> chip_modes;
-    wifi_chip->getAvailableModes(
-        [&](WifiStatus status, const hidl_vec<IWifiChip::ChipMode>& modes) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            chip_modes = modes;
-        });
-    if (operation_failed) {
+    const auto& status_and_modes = HIDL_INVOKE(wifi_chip, getAvailableModes);
+    if (status_and_modes.first.code != WifiStatusCode::SUCCESS) {
         return false;
     }
 
     ChipModeId mode_id;
-    if (!findModeToSupportIfaceType(type, chip_modes, &mode_id)) {
+    if (!findModeToSupportIfaceType(type, status_and_modes.second, &mode_id)) {
         return false;
     }
 
-    wifi_chip->configureChip(mode_id, [&](WifiStatus status) {
-        if (status.code != WifiStatusCode::SUCCESS) {
-            operation_failed = true;
-        }
-    });
-    if (operation_failed) {
+    if (HIDL_INVOKE(wifi_chip, configureChip, mode_id).code !=
+        WifiStatusCode::SUCCESS) {
         return false;
     }
     return true;
@@ -154,19 +125,11 @@
         return nullptr;
     }
 
-    bool operation_failed = false;
-    sp<IWifiApIface> wifi_ap_iface;
-    wifi_chip->createApIface(
-        [&](const WifiStatus& status, const sp<IWifiApIface>& iface) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            wifi_ap_iface = iface;
-        });
-    if (operation_failed) {
+    const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createApIface);
+    if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
-    return wifi_ap_iface;
+    return status_and_iface.second;
 }
 
 sp<IWifiNanIface> getWifiNanIface() {
@@ -178,19 +141,11 @@
         return nullptr;
     }
 
-    bool operation_failed = false;
-    sp<IWifiNanIface> wifi_nan_iface;
-    wifi_chip->createNanIface(
-        [&](const WifiStatus& status, const sp<IWifiNanIface>& iface) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            wifi_nan_iface = iface;
-        });
-    if (operation_failed) {
+    const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createNanIface);
+    if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
-    return wifi_nan_iface;
+    return status_and_iface.second;
 }
 
 sp<IWifiP2pIface> getWifiP2pIface() {
@@ -202,19 +157,11 @@
         return nullptr;
     }
 
-    bool operation_failed = false;
-    sp<IWifiP2pIface> wifi_p2p_iface;
-    wifi_chip->createP2pIface(
-        [&](const WifiStatus& status, const sp<IWifiP2pIface>& iface) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            wifi_p2p_iface = iface;
-        });
-    if (operation_failed) {
+    const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createP2pIface);
+    if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
-    return wifi_p2p_iface;
+    return status_and_iface.second;
 }
 
 sp<IWifiStaIface> getWifiStaIface() {
@@ -226,19 +173,11 @@
         return nullptr;
     }
 
-    bool operation_failed = false;
-    sp<IWifiStaIface> wifi_sta_iface;
-    wifi_chip->createStaIface(
-        [&](const WifiStatus& status, const sp<IWifiStaIface>& iface) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            wifi_sta_iface = iface;
-        });
-    if (operation_failed) {
+    const auto& status_and_iface = HIDL_INVOKE(wifi_chip, createStaIface);
+    if (status_and_iface.first.code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
-    return wifi_sta_iface;
+    return status_and_iface.second;
 }
 
 sp<IWifiRttController> getWifiRttController() {
@@ -251,26 +190,16 @@
         return nullptr;
     }
 
-    bool operation_failed = false;
-    sp<IWifiRttController> wifi_rtt_controller;
-    wifi_chip->createRttController(
-        wifi_sta_iface, [&](const WifiStatus& status,
-                            const sp<IWifiRttController>& controller) {
-            if (status.code != WifiStatusCode::SUCCESS) {
-                operation_failed = true;
-            }
-            wifi_rtt_controller = controller;
-        });
-    if (operation_failed) {
+    const auto& status_and_controller =
+        HIDL_INVOKE(wifi_chip, createRttController, wifi_sta_iface);
+    if (status_and_controller.first.code != WifiStatusCode::SUCCESS) {
         return nullptr;
     }
-    return wifi_rtt_controller;
+    return status_and_controller.second;
 }
 
 void stopWifi() {
     sp<IWifi> wifi = getWifi();
     ASSERT_NE(wifi, nullptr);
-    wifi->stop([](const WifiStatus& status) {
-        ASSERT_EQ(status.code, WifiStatusCode::SUCCESS);
-    });
+    ASSERT_EQ(HIDL_INVOKE(wifi, stop).code, WifiStatusCode::SUCCESS);
 }