Merge "Add missing LOW_LATENCY_OFFBODY_DETECT handling"
diff --git a/audio/effect/2.0/vts/functional/VtsHalAudioEffectV2_0TargetTest.cpp b/audio/effect/2.0/vts/functional/VtsHalAudioEffectV2_0TargetTest.cpp
index f6da213..15a564a 100644
--- a/audio/effect/2.0/vts/functional/VtsHalAudioEffectV2_0TargetTest.cpp
+++ b/audio/effect/2.0/vts/functional/VtsHalAudioEffectV2_0TargetTest.cpp
@@ -31,8 +31,10 @@
 using android::hardware::audio::common::V2_0::AudioDevice;
 using android::hardware::audio::common::V2_0::AudioHandleConsts;
 using android::hardware::audio::common::V2_0::AudioMode;
+using android::hardware::audio::common::V2_0::AudioSource;
 using android::hardware::audio::common::V2_0::Uuid;
 using android::hardware::audio::effect::V2_0::AudioBuffer;
+using android::hardware::audio::effect::V2_0::EffectAuxChannelsConfig;
 using android::hardware::audio::effect::V2_0::EffectBufferConfig;
 using android::hardware::audio::effect::V2_0::EffectConfig;
 using android::hardware::audio::effect::V2_0::EffectDescriptor;
@@ -278,6 +280,33 @@
   EXPECT_EQ(Result::OK, ret2);
 }
 
+TEST_F(AudioEffectHidlTest, GetConfigReverse) {
+  description("Verify that GetConfigReverse does not crash");
+  Return<void> ret =
+      effect->getConfigReverse([&](Result, const EffectConfig&) {});
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, GetSupportedAuxChannelsConfigs) {
+  description("Verify that GetSupportedAuxChannelsConfigs does not crash");
+  Return<void> ret = effect->getSupportedAuxChannelsConfigs(
+      0, [&](Result, const hidl_vec<EffectAuxChannelsConfig>&) {});
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, GetAuxChannelsConfig) {
+  description("Verify that GetAuxChannelsConfig does not crash");
+  Return<void> ret = effect->getAuxChannelsConfig(
+      [&](Result, const EffectAuxChannelsConfig&) {});
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, SetAuxChannelsConfig) {
+  description("Verify that SetAuxChannelsConfig does not crash");
+  Return<Result> ret = effect->setAuxChannelsConfig(EffectAuxChannelsConfig());
+  EXPECT_TRUE(ret.isOk());
+}
+
 // Not generated automatically because AudioBuffer contains
 // instances of hidl_memory which can't be compared properly
 // in general case due to presence of handles.
@@ -394,6 +423,25 @@
   EXPECT_EQ(Result::OK, ret);
 }
 
+TEST_F(AudioEffectHidlTest, SetConfigReverse) {
+  description("Verify that SetConfigReverse does not crash");
+  Return<Result> ret =
+      effect->setConfigReverse(EffectConfig(), nullptr, nullptr);
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, SetInputDevice) {
+  description("Verify that SetInputDevice does not crash");
+  Return<Result> ret = effect->setInputDevice(AudioDevice::IN_BUILTIN_MIC);
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, SetAudioSource) {
+  description("Verify that SetAudioSource does not crash");
+  Return<Result> ret = effect->setAudioSource(AudioSource::MIC);
+  EXPECT_TRUE(ret.isOk());
+}
+
 TEST_F(AudioEffectHidlTest, Offload) {
   description("Verify that calling Offload methods works for an effect");
   EffectOffloadParameter offloadParam;
@@ -434,17 +482,48 @@
   EXPECT_EQ(Result::OK, ret2);
 }
 
-// Testing getConfigReverse, getAuxChannelsConfig,
-// getSupportedAuxChannelsConfigs, setAudioSource, setConfigReverse,
-// setInputDevice doesn't make sense, because normally they are not supported by
-// the Equalizer, but it wouldn't be a problem if some vendor implementation
-// supports them, thus we can't test these methods neither for success, nor for
-// failure.
+TEST_F(AudioEffectHidlTest, Command) {
+  description("Verify that Command does not crash");
+  Return<void> ret = effect->command(0, hidl_vec<uint8_t>(), 0,
+                                     [&](int32_t, const hidl_vec<uint8_t>&) {});
+  EXPECT_TRUE(ret.isOk());
+}
 
-// command, getParameter, getSupportedConfigsForFeature,
-// getCurrentConfigForFeature, setCurrentConfigForFeature, setParameter are
-// opaque channels between vendor apps and HALs, and can't be meaningfully
-// tested with effects that don't support them.
+TEST_F(AudioEffectHidlTest, SetParameter) {
+  description("Verify that SetParameter does not crash");
+  Return<Result> ret =
+      effect->setParameter(hidl_vec<uint8_t>(), hidl_vec<uint8_t>());
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, GetParameter) {
+  description("Verify that GetParameter does not crash");
+  Return<void> ret = effect->getParameter(
+      hidl_vec<uint8_t>(), 0, [&](Result, const hidl_vec<uint8_t>&) {});
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, GetSupportedConfigsForFeature) {
+  description("Verify that GetSupportedConfigsForFeature does not crash");
+  Return<void> ret = effect->getSupportedConfigsForFeature(
+      0, 0, 0, [&](Result, uint32_t, const hidl_vec<uint8_t>&) {});
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, GetCurrentConfigForFeature) {
+  description("Verify that GetCurrentConfigForFeature does not crash");
+  Return<void> ret = effect->getCurrentConfigForFeature(
+      0, 0, [&](Result, const hidl_vec<uint8_t>&) {});
+  EXPECT_TRUE(ret.isOk());
+}
+
+TEST_F(AudioEffectHidlTest, SetCurrentConfigForFeature) {
+  description("Verify that SetCurrentConfigForFeature does not crash");
+  Return<Result> ret =
+      effect->setCurrentConfigForFeature(0, hidl_vec<uint8_t>());
+  EXPECT_TRUE(ret.isOk());
+}
+
 
 // The main test class for Equalizer Audio Effect HIDL HAL.
 class EqualizerAudioEffectHidlTest : public AudioEffectHidlTest {
diff --git a/biometrics/fingerprint/2.1/vts/functional/VtsHalBiometricsFingerprintV2_1TargetTest.cpp b/biometrics/fingerprint/2.1/vts/functional/VtsHalBiometricsFingerprintV2_1TargetTest.cpp
index cd38f2e..d3f6612 100644
--- a/biometrics/fingerprint/2.1/vts/functional/VtsHalBiometricsFingerprintV2_1TargetTest.cpp
+++ b/biometrics/fingerprint/2.1/vts/functional/VtsHalBiometricsFingerprintV2_1TargetTest.cpp
@@ -23,6 +23,10 @@
 #include <hidl/HidlTransportSupport.h>
 #include <VtsHalHidlTargetTestBase.h>
 
+#include <cinttypes>
+#include <future>
+#include <utility>
+
 using android::Condition;
 using android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprint;
 using android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback;
@@ -34,156 +38,423 @@
 using android::Mutex;
 using android::sp;
 
+namespace {
+
+static const uint32_t kTimeout = 3;
+static const std::chrono::seconds kTimeoutInSeconds = std::chrono::seconds(kTimeout);
+static const uint32_t kGroupId = 99;
+static const std::string kTmpDir = "/data/local/tmp/";
+static const uint32_t kIterations = 1000;
+
+// Wait for a callback to occur (signaled by the given future) up to the
+// provided timeout. If the future is invalid or the callback does not come
+// within the given time, returns false.
+template<class ReturnType>
+bool waitForCallback(
+    std::future<ReturnType> future,
+    std::chrono::milliseconds timeout = kTimeoutInSeconds) {
+  auto expiration = std::chrono::system_clock::now() + timeout;
+
+  EXPECT_TRUE(future.valid());
+  if (future.valid()) {
+    std::future_status status = future.wait_until(expiration);
+    EXPECT_NE(std::future_status::timeout, status)
+        << "Timed out waiting for callback";
+    if (status == std::future_status::ready) {
+      return true;
+    }
+  }
+
+  return false;
+}
+
+// Base callback implementation that just logs all callbacks by default
+class FingerprintCallbackBase : public IBiometricsFingerprintClientCallback {
+ public:
+  // implement methods of IBiometricsFingerprintClientCallback
+  virtual Return<void> onEnrollResult(uint64_t, uint32_t, uint32_t, uint32_t)
+      override {
+    ALOGD("Enroll callback called.");
+    return Return<void>();
+  }
+
+  virtual Return<void> onAcquired(uint64_t, FingerprintAcquiredInfo, int32_t)
+      override {
+    ALOGD("Acquired callback called.");
+    return Return<void>();
+  }
+
+  virtual Return<void> onAuthenticated(uint64_t, uint32_t, uint32_t,
+      const hidl_vec<uint8_t>&) override {
+    ALOGD("Authenticated callback called.");
+    return Return<void>();
+  }
+
+  virtual Return<void> onError(uint64_t, FingerprintError, int32_t)
+      override {
+    ALOGD("Error callback called.");
+    EXPECT_TRUE(false);  // fail any test that triggers an error
+    return Return<void>();
+  }
+
+  virtual Return<void> onRemoved(uint64_t, uint32_t, uint32_t, uint32_t)
+      override {
+    ALOGD("Removed callback called.");
+    return Return<void>();
+  }
+
+  virtual Return<void> onEnumerate(uint64_t, uint32_t, uint32_t, uint32_t)
+      override {
+    ALOGD("Enumerate callback called.");
+    return Return<void>();
+  }
+};
+
+class EnumerateCallback : public FingerprintCallbackBase {
+ public:
+  virtual Return<void> onEnumerate(uint64_t deviceId, uint32_t fingerId,
+      uint32_t groupId, uint32_t remaining) override {
+    this->deviceId = deviceId;
+    this->fingerId = fingerId;
+    this->groupId = groupId;
+    this->remaining = remaining;
+
+    if(remaining == 0UL) {
+      promise.set_value();
+    }
+    return Return<void>();
+  }
+
+  uint64_t deviceId;
+  uint32_t fingerId;
+  uint32_t groupId;
+  uint32_t remaining;
+  std::promise<void> promise;
+};
+
+class ErrorCallback : public FingerprintCallbackBase {
+ public:
+  ErrorCallback(
+      bool filterErrors=false,
+      FingerprintError errorType=FingerprintError::ERROR_NO_ERROR) {
+    this->filterErrors = filterErrors;
+    this->errorType = errorType;
+  }
+
+  virtual Return<void> onError(uint64_t deviceId, FingerprintError error,
+      int32_t vendorCode) override {
+    if ((this->filterErrors && this->errorType == error) || !this->filterErrors) {
+      this->deviceId = deviceId;
+      this->error = error;
+      this->vendorCode = vendorCode;
+      promise.set_value();
+    }
+    return Return<void>();
+  }
+
+  bool filterErrors;
+  FingerprintError errorType;
+  uint64_t deviceId;
+  FingerprintError error;
+  int32_t vendorCode;
+  std::promise<void> promise;
+};
+
+class RemoveCallback : public FingerprintCallbackBase {
+ public:
+  RemoveCallback(uint32_t groupId) {
+    this->removeGroupId = groupId;
+  }
+
+  virtual Return<void> onRemoved(uint64_t, uint32_t, uint32_t groupId,
+      uint32_t remaining) override {
+    EXPECT_EQ(this->removeGroupId, groupId);
+    if(remaining == 0UL) {
+      promise.set_value();
+    }
+    return Return<void>();
+  }
+
+  uint32_t removeGroupId;
+  std::promise<void> promise;
+};
+
 class FingerprintHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+ public:
+  virtual void SetUp() override {
+    mService = ::testing::VtsHalHidlTargetTestBase::getService<IBiometricsFingerprint>();
+    ASSERT_FALSE(mService == nullptr);
 
-protected:
-    class MyCallback : public IBiometricsFingerprintClientCallback {
+    // Create an active group
+    Return<RequestStatus> res = mService->setActiveGroup(kGroupId, kTmpDir);
+    ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+  }
 
-        // implement methods of IBiometricsFingerprintClientCallback
-        virtual Return<void> onEnrollResult(uint64_t, uint32_t, uint32_t,
-                uint32_t) override {
-            callBackCalled();
-            return Return<void>();
-        }
+  virtual void TearDown() override {}
 
-        virtual Return<void> onAcquired(uint64_t, FingerprintAcquiredInfo,
-                int32_t) override {
-            callBackCalled();
-            return Return<void>();
-        }
-
-        virtual Return<void> onAuthenticated(uint64_t, uint32_t, uint32_t,
-                const hidl_vec<uint8_t>&) override {
-            callBackCalled();
-            return Return<void>();
-        }
-
-        virtual Return<void> onError(uint64_t, FingerprintError error, int32_t)
-                override {
-            mTestCase->mErr = error;
-            callBackCalled();
-            return Return<void>();
-        }
-
-        virtual Return<void> onRemoved(uint64_t, uint32_t, uint32_t, uint32_t)
-                override {
-            callBackCalled();
-            return Return<void>();
-        }
-
-        virtual Return<void> onEnumerate(uint64_t, uint32_t, uint32_t,
-                uint32_t) override {
-            callBackCalled();
-            return Return<void>();
-        }
-
-        void callBackCalled () {
-            mTestCase->mCallbackCalled = true;
-            mTestCase->mCallbackCond.broadcast();
-        }
-
-        FingerprintHidlTest* mTestCase;
-    public:
-        MyCallback(FingerprintHidlTest* aTest) : mTestCase(aTest) {}
-    };
-
-    sp<MyCallback> mCallback;
-    bool mCallbackCalled;
-    Condition mCallbackCond;
-    FingerprintError mErr;
-    Mutex mLock;
-    sp<IBiometricsFingerprint> mService;
-    static const unsigned int kThresholdInSeconds = 3;
-
-    void clearErr () {
-        mErr = FingerprintError::ERROR_NO_ERROR;
-    }
-
-    // Timed callback mechanism.  Will block up to kThresholdInSeconds,
-    // returning true if callback was invoked in that time frame.
-    bool waitForCallback(const unsigned int seconds = kThresholdInSeconds) {
-        nsecs_t reltime = seconds_to_nanoseconds(seconds);
-        Mutex::Autolock _l(mLock);
-        nsecs_t endTime = systemTime() + reltime;
-        while (!mCallbackCalled) {
-            if (reltime == 0) {
-                mCallbackCond.wait(mLock);
-            } else {
-                nsecs_t now = systemTime();
-                if (now > endTime) {
-                    return false;
-                }
-                mCallbackCond.waitRelative(mLock, endTime - now);
-            }
-        }
-        return true;
-    }
-public:
-    FingerprintHidlTest (): mCallbackCalled(false) {}
-
-    virtual void SetUp() override {
-        mService = ::testing::VtsHalHidlTargetTestBase::getService<IBiometricsFingerprint>();
-
-        ASSERT_NE(mService, nullptr);
-        clearErr();
-
-        mCallback = new MyCallback(this);
-        // TODO: instantly fail any test that receives a death notification
-    }
-
-    virtual void TearDown() override {}
+  sp<IBiometricsFingerprint> mService;
 };
 
-class FingerprintHidlEnvironment : public ::testing::Environment {
-public:
-    virtual void SetUp() {}
-    virtual void TearDown() {}
-};
 
 // The service should be reachable.
 TEST_F(FingerprintHidlTest, ConnectTest) {
-    Return<uint64_t> rc = mService->setNotify(mCallback);
-    EXPECT_NE(rc, 0UL);
+  sp<FingerprintCallbackBase> cb = new FingerprintCallbackBase();
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+}
+
+// Starting the service with null callback should succeed.
+TEST_F(FingerprintHidlTest, ConnectNullTest) {
+  Return<uint64_t> rc = mService->setNotify(NULL);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+}
+
+// Pre-enroll should always return unique, cryptographically secure, non-zero number
+TEST_F(FingerprintHidlTest, PreEnrollTest) {
+  std::map<uint64_t, uint64_t> m;
+
+  for(unsigned int i = 0; i < kIterations; ++i) {
+    uint64_t res = static_cast<uint64_t>(mService->preEnroll());
+    EXPECT_NE(0UL, res);
+    m[res]++;
+    EXPECT_EQ(1UL, m[res]);
+  }
+}
+
+// Enroll with an invalid (all zeroes) HAT should fail.
+TEST_F(FingerprintHidlTest, EnrollInvalidHatTest) {
+  sp<ErrorCallback> cb = new ErrorCallback();
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+
+  uint8_t token[69];
+  for(int i=0; i<69; i++) {
+    token[i] = 0;
+  }
+
+  Return<RequestStatus> res = mService->enroll(token, kGroupId, kTimeout);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // At least one call to onError should occur
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+  ASSERT_NE(FingerprintError::ERROR_NO_ERROR, cb->error);
+}
+
+// Enroll with an invalid (null) HAT should fail.
+TEST_F(FingerprintHidlTest, EnrollNullTest) {
+  sp<ErrorCallback> cb = new ErrorCallback();
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+
+  uint8_t token[69];
+  Return<RequestStatus> res = mService->enroll(token, kGroupId, kTimeout);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // At least one call to onError should occur
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+  ASSERT_NE(FingerprintError::ERROR_NO_ERROR, cb->error);
+}
+
+// PostEnroll should always return within 3s
+TEST_F(FingerprintHidlTest, PostEnrollTest) {
+  sp<FingerprintCallbackBase> cb = new FingerprintCallbackBase();
+  Return<uint64_t> rc = mService->setNotify(cb);
+
+  auto start = std::chrono::system_clock::now();
+  Return<RequestStatus> res = mService->postEnroll();
+  auto elapsed = std::chrono::system_clock::now() - start;
+  ASSERT_GE(kTimeoutInSeconds, elapsed);
+}
+
+// getAuthenticatorId should always return non-zero numbers
+TEST_F(FingerprintHidlTest, GetAuthenticatorIdTest) {
+  Return<uint64_t> res = mService->getAuthenticatorId();
+  EXPECT_NE(0UL, static_cast<uint64_t>(res));
+}
+
+// Enumerate should always trigger onEnumerated(fid=0, rem=0) when there are no fingerprints
+TEST_F(FingerprintHidlTest, EnumerateTest) {
+  sp<EnumerateCallback> cb = new EnumerateCallback();
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+
+  // Callback will return when rem=0 is found
+  Return<RequestStatus> res = mService->enumerate();
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+  EXPECT_EQ(0UL, cb->fingerId);
+  EXPECT_EQ(0UL, cb->remaining);
+
+}
+
+// Remove should succeed on any inputs
+// At least one callback with "remaining=0" should occur
+TEST_F(FingerprintHidlTest, RemoveFingerprintTest) {
+  // Register callback
+  sp<RemoveCallback> cb = new RemoveCallback(kGroupId);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+
+  // Remove a fingerprint
+  Return<RequestStatus> res = mService->remove(kGroupId, 1);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // At least one call to onRemove with remaining=0 should occur
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+}
+
+// Remove should accept 0 to delete all fingerprints
+// At least one callback with "remaining=0" should occur.
+TEST_F(FingerprintHidlTest, RemoveAllFingerprintsTest) {
+  // Register callback
+  sp<RemoveCallback> cb = new RemoveCallback(kGroupId);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
+
+  // Remove all fingerprints
+  Return<RequestStatus> res = mService->remove(kGroupId, 0);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+}
+
+// Active group should successfully set to a writable location.
+TEST_F(FingerprintHidlTest, SetActiveGroupTest) {
+  // Create an active group
+  Return<RequestStatus> res = mService->setActiveGroup(2, kTmpDir);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // Reset active group
+  res = mService->setActiveGroup(kGroupId, kTmpDir);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+}
+
+// Active group should fail to set to an unwritable location.
+TEST_F(FingerprintHidlTest, SetActiveGroupUnwritableTest) {
+  // Create an active group to an unwritable location (device root dir)
+  Return<RequestStatus> res = mService->setActiveGroup(3, "/");
+  ASSERT_NE(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // Reset active group
+  res = mService->setActiveGroup(kGroupId, kTmpDir);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+}
+
+// Active group should fail to set to a null location.
+TEST_F(FingerprintHidlTest, SetActiveGroupNullTest) {
+  // Create an active group to a null location.
+  Return<RequestStatus> res = mService->setActiveGroup(4, nullptr);
+  ASSERT_NE(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // Reset active group
+  res = mService->setActiveGroup(kGroupId, kTmpDir);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
 }
 
 // Cancel should always return ERROR_CANCELED from any starting state including
 // the IDLE state.
 TEST_F(FingerprintHidlTest, CancelTest) {
-    Return<uint64_t> rc = mService->setNotify(mCallback);
-    EXPECT_NE(rc, 0UL);
+  sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0UL, static_cast<uint64_t>(rc));
 
-    Return<RequestStatus> res = mService->cancel();
-    // make sure callback was invoked within kThresholdInSeconds
-    EXPECT_EQ(true, waitForCallback());
-    // check that we were able to make an IPC request successfully
-    EXPECT_EQ(RequestStatus::SYS_OK, res);
-    // check error should be ERROR_CANCELED
-    EXPECT_EQ(FingerprintError::ERROR_CANCELED, mErr);
+  Return<RequestStatus> res = mService->cancel();
+  // check that we were able to make an IPC request successfully
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // make sure callback was invoked within kTimeoutInSeconds
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+  // check error should be ERROR_CANCELED
+  ASSERT_EQ(FingerprintError::ERROR_CANCELED, cb->error);
 }
 
-// A call to cancel should after any other method call should set the error
-// state to canceled.
-TEST_F(FingerprintHidlTest, AuthTest) {
-    Return<uint64_t> rc = mService->setNotify(mCallback);
-    EXPECT_NE(rc, 0UL);
+// A call to cancel should succeed during enroll.
+TEST_F(FingerprintHidlTest, CancelEnrollTest) {
+  Return<RequestStatus> res = mService->setActiveGroup(kGroupId, kTmpDir);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
 
-    Return<RequestStatus> res = mService->authenticate(0, 0);
-    // check that we were able to make an IPC request successfully
-    EXPECT_EQ(RequestStatus::SYS_OK, res);
+  sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0U, static_cast<uint64_t>(rc));
 
-    res = mService->cancel();
-    // make sure callback was invoked within kThresholdInSeconds
-    EXPECT_EQ(true, waitForCallback());
-    // check that we were able to make an IPC request successfully
-    EXPECT_EQ(RequestStatus::SYS_OK, res);
-    // check error should be ERROR_CANCELED
-    EXPECT_EQ(FingerprintError::ERROR_CANCELED, mErr);
+  uint8_t token[69];
+  res = mService->enroll(token, kGroupId, kTimeout);
+  // check that we were able to make an IPC request successfully
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  res = mService->cancel();
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // make sure callback was invoked within kTimeoutInSeconds
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+
+  // check error should be ERROR_CANCELED
+  ASSERT_EQ(FingerprintError::ERROR_CANCELED, cb->error);
 }
 
+// A call to cancel should succeed during authentication.
+TEST_F(FingerprintHidlTest, CancelAuthTest) {
+  sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0U, static_cast<uint64_t>(rc));
+
+  Return<RequestStatus> res = mService->authenticate(0, kGroupId);
+  // check that we were able to make an IPC request successfully
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  res = mService->cancel();
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // make sure callback was invoked within kTimeoutInSeconds
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+
+  // check error should be ERROR_CANCELED
+  ASSERT_EQ(FingerprintError::ERROR_CANCELED, cb->error);
+}
+
+// A call to cancel should succeed during authentication.
+TEST_F(FingerprintHidlTest, CancelRemoveTest) {
+  sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0U, static_cast<uint64_t>(rc));
+
+  // Remove a fingerprint
+  Return<RequestStatus> res = mService->remove(kGroupId, 1);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  res = mService->cancel();
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // make sure callback was invoked within kTimeoutInSeconds
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+
+  // check error should be ERROR_CANCELED
+  ASSERT_EQ(FingerprintError::ERROR_CANCELED, cb->error);
+}
+
+// A call to cancel should succeed during authentication.
+TEST_F(FingerprintHidlTest, CancelRemoveAllTest) {
+  sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
+  Return<uint64_t> rc = mService->setNotify(cb);
+  ASSERT_NE(0U, static_cast<uint64_t>(rc));
+
+  // Remove a fingerprint
+  Return<RequestStatus> res = mService->remove(kGroupId, 0);
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  res = mService->cancel();
+  ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
+
+  // make sure callback was invoked within kTimeoutInSeconds
+  ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
+
+  // check error should be ERROR_CANCELED
+  ASSERT_EQ(FingerprintError::ERROR_CANCELED, cb->error);
+}
+}  // anonymous namespace
+
 int main(int argc, char **argv) {
-    ::testing::AddGlobalTestEnvironment(new FingerprintHidlEnvironment);
-    ::testing::InitGoogleTest(&argc, argv);
-    int status = RUN_ALL_TESTS();
-    LOG(INFO) << "Test result = " << status;
-    return status;
+  ::testing::InitGoogleTest(&argc, argv);
+  int status = RUN_ALL_TESTS();
+  LOG(INFO) << "Test result = " << status;
+  return status;
 }
+
diff --git a/bluetooth/1.0/Android.bp b/bluetooth/1.0/Android.bp
index 2373ceb..75cdcfc 100644
--- a/bluetooth/1.0/Android.bp
+++ b/bluetooth/1.0/Android.bp
@@ -32,6 +32,7 @@
     ],
     out: [
         "android/hardware/bluetooth/1.0/types.h",
+        "android/hardware/bluetooth/1.0/hwtypes.h",
         "android/hardware/bluetooth/1.0/IBluetoothHci.h",
         "android/hardware/bluetooth/1.0/IHwBluetoothHci.h",
         "android/hardware/bluetooth/1.0/BnHwBluetoothHci.h",
diff --git a/boot/1.0/Android.bp b/boot/1.0/Android.bp
index 7265cc2..498c940 100644
--- a/boot/1.0/Android.bp
+++ b/boot/1.0/Android.bp
@@ -30,6 +30,7 @@
     ],
     out: [
         "android/hardware/boot/1.0/types.h",
+        "android/hardware/boot/1.0/hwtypes.h",
         "android/hardware/boot/1.0/IBootControl.h",
         "android/hardware/boot/1.0/IHwBootControl.h",
         "android/hardware/boot/1.0/BnHwBootControl.h",
diff --git a/broadcastradio/1.0/default/BroadcastRadio.cpp b/broadcastradio/1.0/default/BroadcastRadio.cpp
index 45ffdb2..72cdc19 100644
--- a/broadcastradio/1.0/default/BroadcastRadio.cpp
+++ b/broadcastradio/1.0/default/BroadcastRadio.cpp
@@ -63,6 +63,7 @@
     if (rc != 0) {
         ALOGE("couldn't load radio module %s.%s (%s)",
               RADIO_HARDWARE_MODULE_ID, classString, strerror(-rc));
+        mStatus = Result::INVALID_ARGUMENTS;
         return;
     }
     rc = radio_hw_device_open(mod, &mHwDevice);
diff --git a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
index 4ec19c7..ebeadb1 100644
--- a/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
+++ b/broadcastradio/1.0/vts/functional/VtsHalBroadcastradioV1_0TargetTest.cpp
@@ -48,21 +48,42 @@
 using ::android::hardware::broadcastradio::V1_0::MetaData;
 
 
+#define RETURN_IF_SKIPPED \
+    if (skipped) { \
+        std::cout << "[  SKIPPED ] This device class is not supported. " << std::endl; \
+        return; \
+    }
+
 // The main test class for Broadcast Radio HIDL HAL.
 
-class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase {
+class BroadcastRadioHidlTest : public ::testing::VtsHalHidlTargetTestBase,
+        public ::testing::WithParamInterface<Class> {
  protected:
     virtual void SetUp() override {
+        ASSERT_EQ(nullptr, mRadio.get());
+
+        radioClass = GetParam();
+        skipped = false;
+
         sp<IBroadcastRadioFactory> factory =
               ::testing::VtsHalHidlTargetTestBase::getService<IBroadcastRadioFactory>();
-        if (factory != 0) {
-            factory->connectModule(Class::AM_FM,
-                             [&](Result retval, const ::android::sp<IBroadcastRadio>& result) {
-                if (retval == Result::OK) {
-                  mRadio = result;
-                }
-            });
+        ASSERT_NE(nullptr, factory.get());
+
+        Result connectResult;
+        factory->connectModule(radioClass, [&](Result ret, const sp<IBroadcastRadio>& radio) {
+            connectResult = ret;
+            mRadio = radio;
+            onCallback_l();
+        });
+        EXPECT_EQ(true, waitForCallback(kConnectCallbacktimeoutNs));
+        mCallbackCalled = false;
+
+        if (connectResult == Result::INVALID_ARGUMENTS) {
+            skipped = true;
+            return;
         }
+        ASSERT_EQ(connectResult, Result::OK);
+
         mTunerCallback = new MyCallback(this);
         ASSERT_NE(nullptr, mRadio.get());
         ASSERT_NE(nullptr, mTunerCallback.get());
@@ -175,9 +196,9 @@
     }
 
 
-        BroadcastRadioHidlTest() :
-            mCallbackCalled(false), mBoolCallbackData(false),
-            mResultCallbackData(Result::OK), mHwFailure(false) {}
+    BroadcastRadioHidlTest()
+        : mCallbackCalled(false), mBoolCallbackData(false), mResultCallbackData(Result::OK),
+        mHwFailure(false) {}
 
     void onCallback_l() {
         if (!mCallbackCalled) {
@@ -208,9 +229,12 @@
     bool openTuner();
     bool checkAntenna();
 
+    static const nsecs_t kConnectCallbacktimeoutNs = seconds_to_nanoseconds(1);
     static const nsecs_t kConfigCallbacktimeoutNs = seconds_to_nanoseconds(10);
     static const nsecs_t kTuneCallbacktimeoutNs = seconds_to_nanoseconds(30);
 
+    Class radioClass;
+    bool skipped;
     sp<IBroadcastRadio> mRadio;
     Properties mHalProperties;
     sp<ITuner> mTuner;
@@ -225,13 +249,6 @@
     bool mHwFailure;
 };
 
-// A class for test environment setup (kept since this file is a template).
-class BroadcastRadioHidlEnvironment : public ::testing::Environment {
- public:
-    virtual void SetUp() {}
-    virtual void TearDown() {}
-};
-
 namespace android {
 namespace hardware {
 namespace broadcastradio {
@@ -331,7 +348,8 @@
  *  - the implementation supports at least one tuner
  *  - the implementation supports at one band
  */
-TEST_F(BroadcastRadioHidlTest, GetProperties) {
+TEST_P(BroadcastRadioHidlTest, GetProperties) {
+    RETURN_IF_SKIPPED;
     EXPECT_EQ(true, getProperties());
 }
 
@@ -342,7 +360,8 @@
  *  - the HAL implements the method
  *  - the method returns 0 (no error) and a valid ITuner interface
  */
-TEST_F(BroadcastRadioHidlTest, OpenTuner) {
+TEST_P(BroadcastRadioHidlTest, OpenTuner) {
+    RETURN_IF_SKIPPED;
     EXPECT_EQ(true, openTuner());
 }
 
@@ -353,7 +372,8 @@
  *  - ITuner destruction gets propagated through HAL
  *  - the openTuner method works well when called for the second time
  */
-TEST_F(BroadcastRadioHidlTest, ReopenTuner) {
+TEST_P(BroadcastRadioHidlTest, ReopenTuner) {
+    RETURN_IF_SKIPPED;
     EXPECT_TRUE(openTuner());
     mTuner.clear();
     EXPECT_TRUE(openTuner());
@@ -366,7 +386,8 @@
  *  - the openTuner method fails when called for the second time without deleting previous
  *    ITuner instance
  */
-TEST_F(BroadcastRadioHidlTest, OpenTunerTwice) {
+TEST_P(BroadcastRadioHidlTest, OpenTunerTwice) {
+    RETURN_IF_SKIPPED;
     EXPECT_TRUE(openTuner());
 
     Result halResult = Result::NOT_INITIALIZED;
@@ -389,7 +410,8 @@
  *  - the configuration callback is received within kConfigCallbacktimeoutNs ns
  *  - the configuration read back from HAl has the same class Id
  */
-TEST_F(BroadcastRadioHidlTest, SetAndGetConfiguration) {
+TEST_P(BroadcastRadioHidlTest, SetAndGetConfiguration) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     // test setConfiguration
     mCallbackCalled = false;
@@ -422,7 +444,8 @@
  *  - the methods returns INVALID_ARGUMENTS on invalid arguments
  *  - the method recovers and succeeds after passing correct arguments
  */
-TEST_F(BroadcastRadioHidlTest, SetConfigurationFails) {
+TEST_P(BroadcastRadioHidlTest, SetConfigurationFails) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
 
     // Let's define a config that's bad for sure.
@@ -456,7 +479,8 @@
  *  - the tuned callback is received within kTuneCallbacktimeoutNs ns
  *  - skipping sub-channel or not does not fail the call
  */
-TEST_F(BroadcastRadioHidlTest, Scan) {
+TEST_P(BroadcastRadioHidlTest, Scan) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     ASSERT_TRUE(checkAntenna());
     // test scan UP
@@ -483,7 +507,8 @@
  *  - the tuned callback is received within kTuneCallbacktimeoutNs ns
  *  - skipping sub-channel or not does not fail the call
  */
-TEST_F(BroadcastRadioHidlTest, Step) {
+TEST_P(BroadcastRadioHidlTest, Step) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     ASSERT_TRUE(checkAntenna());
     // test step UP
@@ -509,7 +534,8 @@
  *  - the methods return 0 (no error)
  *  - the tuned callback is received within kTuneCallbacktimeoutNs ns after tune()
  */
-TEST_F(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) {
+TEST_P(BroadcastRadioHidlTest, TuneAndGetProgramInformationAndCancel) {
+    RETURN_IF_SKIPPED;
     ASSERT_EQ(true, openTuner());
     ASSERT_TRUE(checkAntenna());
 
@@ -566,7 +592,8 @@
  *  - the method returns INVALID_ARGUMENTS when applicable
  *  - the method recovers and succeeds after passing correct arguments
  */
-TEST_F(BroadcastRadioHidlTest, TuneFailsOutOfBounds) {
+TEST_P(BroadcastRadioHidlTest, TuneFailsOutOfBounds) {
+    RETURN_IF_SKIPPED;
     ASSERT_TRUE(openTuner());
     ASSERT_TRUE(checkAntenna());
 
@@ -595,9 +622,12 @@
     EXPECT_TRUE(waitForCallback(kTuneCallbacktimeoutNs));
 }
 
+INSTANTIATE_TEST_CASE_P(
+    BroadcastRadioHidlTestCases,
+    BroadcastRadioHidlTest,
+    ::testing::Values(Class::AM_FM, Class::SAT, Class::DT));
 
 int main(int argc, char** argv) {
-  ::testing::AddGlobalTestEnvironment(new BroadcastRadioHidlEnvironment);
   ::testing::InitGoogleTest(&argc, argv);
   int status = RUN_ALL_TESTS();
   ALOGI("Test result = %d", status);
diff --git a/broadcastradio/1.1/Android.bp b/broadcastradio/1.1/Android.bp
index 570d1ae..12611dd 100644
--- a/broadcastradio/1.1/Android.bp
+++ b/broadcastradio/1.1/Android.bp
@@ -4,6 +4,7 @@
     name: "android.hardware.broadcastradio@1.1_hal",
     srcs: [
         "types.hal",
+        "IBroadcastRadio.hal",
         "IBroadcastRadioFactory.hal",
         "ITuner.hal",
         "ITunerCallback.hal",
@@ -19,6 +20,7 @@
     ],
     out: [
         "android/hardware/broadcastradio/1.1/types.cpp",
+        "android/hardware/broadcastradio/1.1/BroadcastRadioAll.cpp",
         "android/hardware/broadcastradio/1.1/BroadcastRadioFactoryAll.cpp",
         "android/hardware/broadcastradio/1.1/TunerAll.cpp",
         "android/hardware/broadcastradio/1.1/TunerCallbackAll.cpp",
@@ -34,6 +36,11 @@
     ],
     out: [
         "android/hardware/broadcastradio/1.1/types.h",
+        "android/hardware/broadcastradio/1.1/IBroadcastRadio.h",
+        "android/hardware/broadcastradio/1.1/IHwBroadcastRadio.h",
+        "android/hardware/broadcastradio/1.1/BnHwBroadcastRadio.h",
+        "android/hardware/broadcastradio/1.1/BpHwBroadcastRadio.h",
+        "android/hardware/broadcastradio/1.1/BsBroadcastRadio.h",
         "android/hardware/broadcastradio/1.1/IBroadcastRadioFactory.h",
         "android/hardware/broadcastradio/1.1/IHwBroadcastRadioFactory.h",
         "android/hardware/broadcastradio/1.1/BnHwBroadcastRadioFactory.h",
diff --git a/broadcastradio/1.1/IBroadcastRadio.hal b/broadcastradio/1.1/IBroadcastRadio.hal
new file mode 100644
index 0000000..a6347c7
--- /dev/null
+++ b/broadcastradio/1.1/IBroadcastRadio.hal
@@ -0,0 +1,30 @@
+/*
+ * 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.broadcastradio@1.1;
+
+import @1.0::IBroadcastRadio;
+
+interface IBroadcastRadio extends @1.0::IBroadcastRadio {
+
+    /*
+     * Retrieve implementation properties.
+     * @return properties A Properties structure containing implementation
+     *                    description and capabilities.
+     */
+    getProperties_1_1() generates (Properties properties);
+
+};
diff --git a/broadcastradio/1.1/ITuner.hal b/broadcastradio/1.1/ITuner.hal
index 4f34019..82d45c6 100644
--- a/broadcastradio/1.1/ITuner.hal
+++ b/broadcastradio/1.1/ITuner.hal
@@ -26,7 +26,33 @@
      *                NOT_INITIALIZED if another error occurs
      * @return info Current program information.
      */
-    getProgramInformation_1_1() generates(Result result, ProgramInfo info);
+    getProgramInformation_1_1() generates (Result result, ProgramInfo info);
+
+    /**
+     * Initiates a background scan to update internally cached program list.
+     *
+     * HAL client may not need to initiate the scan explicitly with this call,
+     * ie. HAL implementation MAY perform the scan on boot. It's a common
+     * practice in devices with two physical tuners with background scanning.
+     *
+     * Device must call backgroundScanComplete if the result is OK, even if the
+     * scan fails later (it must pass proper result through the callback).
+     * Otherwise, backgroundScanComplete must not be called as a result of this
+     * certain attempt. It may still be called as a response to another call to
+     * startBackgroundScan, former or latter.
+     *
+     * Device may utilize an already running (but not finished) scan for
+     * subsequent calls to startBackgroundScan, issuing a single
+     * backgroundScanComplete callback.
+     *
+     * @return result OK if the scan was properly scheduled (this does not mean
+     *                it successfully finished).
+     *                TEMPORARILY_UNAVAILABLE if the background scan is
+     *                temporarily unavailable, ie. due to ongoing foreground
+     *                playback in single-tuner device.
+     *                NOT_INITIALIZED other error, ie. HW failure.
+     */
+    startBackgroundScan() generates (ProgramListResult result);
 
     /**
      * Retrieve station list.
@@ -40,11 +66,12 @@
      *               before setting this parameter to anything else.
      * @return result OK if the list was successfully retrieved.
      *                NOT_READY if the scan is in progress.
-     *                NOT_STARTED if the scan has not been started.
+     *                NOT_STARTED if the scan has not been started, client may
+     *                call startBackgroundScan to fix this.
      *                NOT_INITIALIZED if any other error occurs.
      * @return programList List of stations available for user.
      */
     getProgramList(string filter)
-            generates(ProgramListResult result, vec<ProgramInfo> programList);
+        generates (ProgramListResult result, vec<ProgramInfo> programList);
 
 };
diff --git a/broadcastradio/1.1/ITunerCallback.hal b/broadcastradio/1.1/ITunerCallback.hal
index 4af6b1f..1ea57e9 100644
--- a/broadcastradio/1.1/ITunerCallback.hal
+++ b/broadcastradio/1.1/ITunerCallback.hal
@@ -19,9 +19,10 @@
 import @1.0::ITunerCallback;
 
 /**
- * Some methods of @1.1::ITunerCallback are updated versions of those from @1.0:ITunerCallback.
- * All 1.1 drivers should call both (eg. tuneComplete and tuneComplete_1_1), while 1.1 clients
- * should ignore 1.0 ones, to avoid receiving a callback twice.
+ * Some methods of @1.1::ITunerCallback are updated versions of those from
+ * @1.0:ITunerCallback. All 1.1 HAL implementations must call both
+ * (eg. tuneComplete and tuneComplete_1_1), while 1.1 clients may ignore 1.0
+ * ones, to avoid receiving a callback twice.
  */
 interface ITunerCallback extends @1.0::ITunerCallback {
     /*
@@ -37,4 +38,27 @@
      * @param info A ProgramInfo structure describing the new tuned station.
      */
     oneway afSwitch_1_1(ProgramInfo info);
+
+    /**
+     * Called by the HAL when background scan initiated by startBackgroundScan
+     * finishes. If the list was changed, programListChanged must be called too.
+     * @param result OK if the scan succeeded, client may retrieve the actual
+     *               list with ITuner::getProgramList.
+     *               TEMPORARILY_UNAVAILABLE if the scan was interrupted due to
+     *               hardware becoming temporarily unavailable.
+     *               NOT_INITIALIZED other error, ie. HW failure.
+     */
+    oneway backgroundScanComplete(ProgramListResult result);
+
+    /**
+     * Called each time the internally cached program list changes. HAL may not
+     * call it immediately, ie. it may wait for a short time to accumulate
+     * multiple list change notifications into a single event.
+     *
+     * It may be triggered either by an explicitly issued background scan,
+     * or a scan issued by the device internally.
+     *
+     * Client may retrieve the actual list with ITuner::getProgramList.
+     */
+    oneway programListChanged();
 };
diff --git a/broadcastradio/1.1/default/BroadcastRadio.cpp b/broadcastradio/1.1/default/BroadcastRadio.cpp
index 611267b..68c9b93 100644
--- a/broadcastradio/1.1/default/BroadcastRadio.cpp
+++ b/broadcastradio/1.1/default/BroadcastRadio.cpp
@@ -94,7 +94,7 @@
 }
 
 
-// Methods from ::android::hardware::broadcastradio::V1_0::IBroadcastRadio follow.
+// Methods from ::android::hardware::broadcastradio::V1_1::IBroadcastRadio follow.
 Return<void> BroadcastRadio::getProperties(getProperties_cb _hidl_cb)
 {
     int rc;
@@ -115,6 +115,11 @@
     return Void();
 }
 
+Return<void> BroadcastRadio::getProperties_1_1(getProperties_1_1_cb _hidl_cb __unused)
+{
+    return Status::fromExceptionCode(Status::EX_UNSUPPORTED_OPERATION);
+}
+
 Return<void> BroadcastRadio::openTuner(const BandConfig& config, bool audio,
     const sp<V1_0::ITunerCallback>& callback, openTuner_cb _hidl_cb)
 {
diff --git a/broadcastradio/1.1/default/BroadcastRadio.h b/broadcastradio/1.1/default/BroadcastRadio.h
index 068979d..7de31a0 100644
--- a/broadcastradio/1.1/default/BroadcastRadio.h
+++ b/broadcastradio/1.1/default/BroadcastRadio.h
@@ -16,7 +16,7 @@
 #ifndef ANDROID_HARDWARE_BROADCASTRADIO_V1_1_BROADCASTRADIO_H
 #define ANDROID_HARDWARE_BROADCASTRADIO_V1_1_BROADCASTRADIO_H
 
-#include <android/hardware/broadcastradio/1.0/IBroadcastRadio.h>
+#include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h>
 #include <android/hardware/broadcastradio/1.1/types.h>
 #include <hardware/radio.h>
 
@@ -30,12 +30,13 @@
 using V1_0::BandConfig;
 using V1_0::Properties;
 
-struct BroadcastRadio : public V1_0::IBroadcastRadio {
+struct BroadcastRadio : public V1_1::IBroadcastRadio {
 
     BroadcastRadio(Class classId);
 
-    // Methods from ::android::hardware::broadcastradio::V1_0::IBroadcastRadio follow.
+    // Methods from ::android::hardware::broadcastradio::V1_1::IBroadcastRadio follow.
     Return<void> getProperties(getProperties_cb _hidl_cb) override;
+    Return<void> getProperties_1_1(getProperties_1_1_cb _hidl_cb) override;
     Return<void> openTuner(const BandConfig& config, bool audio,
             const sp<V1_0::ITunerCallback>& callback, openTuner_cb _hidl_cb) override;
 
diff --git a/broadcastradio/1.1/default/Tuner.cpp b/broadcastradio/1.1/default/Tuner.cpp
index b4eb184..f280754 100644
--- a/broadcastradio/1.1/default/Tuner.cpp
+++ b/broadcastradio/1.1/default/Tuner.cpp
@@ -200,6 +200,10 @@
     return Void();
 }
 
+Return<ProgramListResult> Tuner::startBackgroundScan() {
+    return ProgramListResult::NOT_INITIALIZED;
+}
+
 Return<void> Tuner::getProgramList(const hidl_string& filter __unused, getProgramList_cb _hidl_cb) {
     hidl_vec<ProgramInfo> pList;
     // TODO(b/34054813): do the actual implementation.
diff --git a/broadcastradio/1.1/default/Tuner.h b/broadcastradio/1.1/default/Tuner.h
index fcf053a..d7b4545 100644
--- a/broadcastradio/1.1/default/Tuner.h
+++ b/broadcastradio/1.1/default/Tuner.h
@@ -42,6 +42,7 @@
     Return<Result> cancel() override;
     Return<void> getProgramInformation(getProgramInformation_cb _hidl_cb) override;
     Return<void> getProgramInformation_1_1(getProgramInformation_1_1_cb _hidl_cb) override;
+    Return<ProgramListResult> startBackgroundScan() override;
     Return<void> getProgramList(const hidl_string& filter, getProgramList_cb _hidl_cb) override;
 
     static void callback(radio_hal_event_t *halEvent, void *cookie);
diff --git a/broadcastradio/1.1/types.hal b/broadcastradio/1.1/types.hal
index b6f72d2..3021f2e 100644
--- a/broadcastradio/1.1/types.hal
+++ b/broadcastradio/1.1/types.hal
@@ -45,6 +45,16 @@
     MUTED = 1 << 1,
 };
 
+struct Properties {
+    @1.0::Properties base;
+
+    /**
+     * The hardware supports background scanning in general. At the given time
+     * it may not be available though, see startBackgroundScan.
+     */
+    bool supportsBackgroundScanning;
+};
+
 /**
  * Radio program information. Returned by the HAL with event RADIO_EVENT_TUNED.
  * Contains information on currently tuned channel.
diff --git a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
index a29f6dc..d3c05c4 100644
--- a/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
+++ b/broadcastradio/1.1/vts/functional/VtsHalBroadcastradioV1_1TargetTest.cpp
@@ -47,6 +47,7 @@
 using ::android::hardware::broadcastradio::V1_1::ITunerCallback;
 using ::android::hardware::broadcastradio::V1_1::ProgramInfo;
 using ::android::hardware::broadcastradio::V1_1::Result;
+using ::android::hardware::broadcastradio::V1_1::ProgramListResult;
 
 
 // The main test class for Broadcast Radio HIDL HAL.
@@ -128,6 +129,14 @@
             return Void();
         }
 
+        virtual Return<void> backgroundScanComplete(ProgramListResult result __unused) {
+            return Void();
+        }
+
+        virtual Return<void> programListChanged() {
+            return Void();
+        }
+
                 MyCallback(BroadcastRadioHidlTest *parentTest) : mParentTest(parentTest) {}
 
      private:
diff --git a/configstore/1.0/Android.bp b/configstore/1.0/Android.bp
index c2cd54a..712e9a7 100644
--- a/configstore/1.0/Android.bp
+++ b/configstore/1.0/Android.bp
@@ -30,6 +30,7 @@
     ],
     out: [
         "android/hardware/configstore/1.0/types.h",
+        "android/hardware/configstore/1.0/hwtypes.h",
         "android/hardware/configstore/1.0/ISurfaceFlingerConfigs.h",
         "android/hardware/configstore/1.0/IHwSurfaceFlingerConfigs.h",
         "android/hardware/configstore/1.0/BnHwSurfaceFlingerConfigs.h",
diff --git a/configstore/utils/include/configstore/Utils.h b/configstore/utils/include/configstore/Utils.h
index 98ccae9..46cc9b0 100644
--- a/configstore/utils/include/configstore/Utils.h
+++ b/configstore/utils/include/configstore/Utils.h
@@ -20,6 +20,10 @@
 #include <hidl/Status.h>
 #include <stdatomic.h>
 
+#pragma push_macro("LOG_TAG")
+#undef LOG_TAG
+#define LOG_TAG "ConfigStoreUtil"
+
 namespace android {
 namespace hardware {
 namespace configstore {
@@ -39,9 +43,13 @@
             // fallback to the default value
             ret.specified = false;
         } else {
-            (*configs.*func)([&ret](V v) {
+            auto status = (*configs.*func)([&ret](V v) {
                 ret = v;
             });
+            if (!status.isOk()) {
+                ALOGE("HIDL call failed. %s", status.description().c_str());
+                ret.specified = false;
+            }
         }
 
         return ret;
@@ -91,4 +99,6 @@
 }  // namespace hardware
 }  // namespace android
 
+#pragma pop_macro("LOG_TAG")
+
 #endif  // ANDROID_HARDWARE_CONFIGSTORE_UTILS_H
diff --git a/gatekeeper/1.0/types.hal b/gatekeeper/1.0/types.hal
index 8c184ee..59076e0 100644
--- a/gatekeeper/1.0/types.hal
+++ b/gatekeeper/1.0/types.hal
@@ -37,6 +37,6 @@
      * otherwise unused (0)
      */
     uint32_t timeout;
-    /* optional crypto blob */
+    /* optional crypto blob. Opaque to Android system. */
     vec<uint8_t> data;
 };
diff --git a/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp b/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp
index 21b7136..bd5cc2e 100644
--- a/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp
+++ b/gnss/1.0/vts/functional/VtsHalGnssV1_0TargetTest.cpp
@@ -31,10 +31,16 @@
 using android::hardware::gnss::V1_0::GnssLocationFlags;
 using android::hardware::gnss::V1_0::IGnss;
 using android::hardware::gnss::V1_0::IGnssCallback;
+using android::hardware::gnss::V1_0::IGnssDebug;
+using android::hardware::gnss::V1_0::IGnssMeasurement;
 using android::sp;
 
 #define TIMEOUT_SEC 3  // for basic commands/responses
 
+// Set these false for release, true for stronger test
+#define GNSS_SIGNAL_IS_PRESENT false
+#define GNSS_ASSISTANCE_IS_PRESENT false
+
 // The main test class for GNSS HAL.
 class GnssHalTest : public ::testing::VtsHalHidlTargetTestBase {
  public:
@@ -273,7 +279,12 @@
 #define PREFERRED_ACCURACY 0   // Ideally perfect (matches GnssLocationProvider)
 #define PREFERRED_TIME_MSEC 0  // Ideally immediate
 
+#if GNSS_ASSISTANCE_IS_PRESENT
+#define LOCATION_TIMEOUT_FIRST_SEC 15
+#else
 #define LOCATION_TIMEOUT_FIRST_SEC 45
+#endif
+
 #define LOCATION_TIMEOUT_SUBSEQUENT_SEC 3
 #define LOCATIONS_TO_CHECK 5
 
@@ -286,16 +297,21 @@
       PREFERRED_ACCURACY, PREFERRED_TIME_MSEC);
 
   ASSERT_TRUE(result.isOk());
-  ASSERT_TRUE(result);
+  EXPECT_TRUE(result);
 
   result = gnss_hal_->start();
 
   ASSERT_TRUE(result.isOk());
-  ASSERT_TRUE(result);
+  EXPECT_TRUE(result);
 
-  // GPS signals initially optional for this test, so don't expect no timeout
-  // yet
+  /*
+   * GPS signals initially optional for this test, so don't expect no timeout
+   * yet
+   */
   wait(LOCATION_TIMEOUT_FIRST_SEC);
+  if (GNSS_SIGNAL_IS_PRESENT) {
+    ASSERT_GT(location_called_count_, 0);
+  }
   if (location_called_count_ > 0) {
     CheckLocation(last_location_, checkMoreAccuracies);
   }
@@ -313,6 +329,88 @@
   ASSERT_TRUE(result);
 }
 
+/*
+ * InjectDelete:
+ * Ensures that calls to inject and/or delete information state are handled.
+ * Better tests await GPS signal
+ */
+TEST_F(GnssHalTest, InjectDelete) {
+  // confidently, well north of Alaska
+  auto result = gnss_hal_->injectLocation(80.0, -170.0, 1000.0);
+
+  // TODO: full self-diff including TODO's :)
+  ASSERT_TRUE(result.isOk());
+  EXPECT_TRUE(result);
+
+  // fake time, but generally reasonable values (time in Aug. 2018)
+  result = gnss_hal_->injectTime(1534567890123L, 123456L, 10000L);
+
+  ASSERT_TRUE(result.isOk());
+  EXPECT_TRUE(result);
+
+  auto resultVoid = gnss_hal_->deleteAidingData(IGnss::GnssAidingData::DELETE_ALL);
+
+  ASSERT_TRUE(resultVoid.isOk());
+}
+
+/*
+ * GetAllExtentions:
+ * Tries getting all optional extensions, and ensures a valid return
+ *   null or actual extension, no crash.
+ * Confirms year-based required extensions (Measurement & Debug) are present
+ */
+TEST_F(GnssHalTest, GetAllExtensions) {
+  // Basic call-is-handled checks
+  auto gnssXtra = gnss_hal_->getExtensionXtra();
+  ASSERT_TRUE(gnssXtra.isOk());
+
+  auto gnssRil = gnss_hal_->getExtensionAGnssRil();
+  ASSERT_TRUE(gnssRil.isOk());
+
+  auto gnssAgnss = gnss_hal_->getExtensionAGnss();
+  ASSERT_TRUE(gnssAgnss.isOk());
+
+  auto gnssNi = gnss_hal_->getExtensionGnssNi();
+  ASSERT_TRUE(gnssNi.isOk());
+
+  auto gnssNavigationMessage = gnss_hal_->getExtensionGnssNavigationMessage();
+  ASSERT_TRUE(gnssNavigationMessage.isOk());
+
+  auto gnssConfiguration = gnss_hal_->getExtensionGnssConfiguration();
+  ASSERT_TRUE(gnssConfiguration.isOk());
+
+  auto gnssGeofencing = gnss_hal_->getExtensionGnssGeofencing();
+  ASSERT_TRUE(gnssGeofencing.isOk());
+
+  auto gnssBatching = gnss_hal_->getExtensionGnssBatching();
+  ASSERT_TRUE(gnssBatching.isOk());
+
+  // Verifying, in some cases, that these return actual extensions
+  auto gnssMeasurement = gnss_hal_->getExtensionGnssMeasurement();
+  ASSERT_TRUE(gnssMeasurement.isOk());
+  if (last_capabilities_ & IGnssCallback::Capabilities::MEASUREMENTS) {
+    sp<IGnssMeasurement> iGnssMeas = gnssMeasurement;
+    EXPECT_NE(iGnssMeas, nullptr);
+  }
+
+  auto gnssDebug = gnss_hal_->getExtensionGnssDebug();
+  ASSERT_TRUE(gnssDebug.isOk());
+  if (info_called_count_ > 0 && last_info_.yearOfHw >= 2017) {
+    sp<IGnssDebug> iGnssDebug = gnssDebug;
+    EXPECT_NE(iGnssDebug, nullptr);
+  }
+}
+
+/*
+ * MeasurementCapabilities:
+ * Verifies that modern hardware supports measurement capabilities.
+ */
+TEST_F(GnssHalTest, MeasurementCapabilites) {
+  if (info_called_count_ > 0 && last_info_.yearOfHw >= 2016) {
+    EXPECT_TRUE(last_capabilities_ & IGnssCallback::Capabilities::MEASUREMENTS);
+  }
+}
+
 int main(int argc, char** argv) {
   ::testing::InitGoogleTest(&argc, argv);
   int status = RUN_ALL_TESTS();
diff --git a/graphics/allocator/2.0/default/android.hardware.graphics.allocator@2.0-service.rc b/graphics/allocator/2.0/default/android.hardware.graphics.allocator@2.0-service.rc
index c4715cd..3e2edda 100644
--- a/graphics/allocator/2.0/default/android.hardware.graphics.allocator@2.0-service.rc
+++ b/graphics/allocator/2.0/default/android.hardware.graphics.allocator@2.0-service.rc
@@ -1,5 +1,5 @@
 service gralloc-2-0 /vendor/bin/hw/android.hardware.graphics.allocator@2.0-service
     class hal
     user system
-    group graphics drmrpc readproc
+    group graphics drmrpc
     onrestart restart surfaceflinger
diff --git a/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc b/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc
index 4f01bd9..b6060db 100644
--- a/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc
+++ b/graphics/composer/2.1/default/android.hardware.graphics.composer@2.1-service.rc
@@ -1,6 +1,6 @@
 service hwcomposer-2-1 /vendor/bin/hw/android.hardware.graphics.composer@2.1-service
     class hal
     user system
-    group graphics drmrpc readproc
+    group graphics drmrpc
     capabilities SYS_NICE
     onrestart restart surfaceflinger
diff --git a/ir/1.0/Android.bp b/ir/1.0/Android.bp
index da49579..5bff1d3 100644
--- a/ir/1.0/Android.bp
+++ b/ir/1.0/Android.bp
@@ -30,6 +30,7 @@
     ],
     out: [
         "android/hardware/ir/1.0/types.h",
+        "android/hardware/ir/1.0/hwtypes.h",
         "android/hardware/ir/1.0/IConsumerIr.h",
         "android/hardware/ir/1.0/IHwConsumerIr.h",
         "android/hardware/ir/1.0/BnHwConsumerIr.h",
diff --git a/keymaster/3.0/IKeymasterDevice.hal b/keymaster/3.0/IKeymasterDevice.hal
index 50a41ec..2664765 100644
--- a/keymaster/3.0/IKeymasterDevice.hal
+++ b/keymaster/3.0/IKeymasterDevice.hal
@@ -43,10 +43,20 @@
      *             key attestation certificates, signed with a key injected in a secure
      *             environment. CDD requires that all devices initially launched with Android O or
      *             later must support hardware attestation.
+     *
+     * @return supportsAllDigests is true if the hardware supports all keymaster digest functions,
+     *             namely ND-5, SHA-1, SHA-224, SHA-256, SHA-384 and SHA-512. CDD requires that all
+     *             devices launched initially with Android O or later must support all digests.
+     *
+     * @return keymasterName is the name of the keymaster implementation.
+     *
+     * @return keymasterAuthorName is the name of the author of the keymaster implementation
+     *             (generally this should be the name of an organization, not an individual.)
      */
     getHardwareFeatures()
-        generates(bool isSecure, bool supportsEllipticCurve,
-                  bool supportsSymmetricCryptography, bool supportsAttestation);
+        generates(bool isSecure, bool supportsEllipticCurve, bool supportsSymmetricCryptography,
+                  bool supportsAttestation, bool supportsAllDigests, string keymasterName,
+                  string keymasterAuthorName);
 
     /**
      * Adds entropy to the RNG used by keymaster. Entropy added through this method is guaranteed
diff --git a/keymaster/3.0/default/KeymasterDevice.cpp b/keymaster/3.0/default/KeymasterDevice.cpp
index 01f0795..720b946 100644
--- a/keymaster/3.0/default/KeymasterDevice.cpp
+++ b/keymaster/3.0/default/KeymasterDevice.cpp
@@ -102,7 +102,8 @@
     return rc;
 }
 
-static int keymaster1_device_initialize(const hw_module_t* mod, keymaster2_device_t** dev) {
+static int keymaster1_device_initialize(const hw_module_t* mod, keymaster2_device_t** dev,
+                                        bool* supports_all_digests) {
     assert(mod->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0);
     ALOGI("Found keymaster1 module %s, version %x", mod->name, mod->module_api_version);
 
@@ -126,6 +127,7 @@
     }
 
     // SoftKeymasterDevice will be deleted by keymaster_device_release()
+    *supports_all_digests = soft_keymaster->supports_all_digests();
     *dev = soft_keymaster.release()->keymaster2_device();
     return 0;
 
@@ -157,7 +159,7 @@
 }
 
 static int keymaster_device_initialize(keymaster2_device_t** dev, uint32_t* version,
-                                       bool* supports_ec) {
+                                       bool* supports_ec, bool* supports_all_digests) {
     const hw_module_t* mod;
 
     *supports_ec = true;
@@ -173,6 +175,7 @@
 
     if (mod->module_api_version < KEYMASTER_MODULE_API_VERSION_1_0) {
         *version = 0;
+        *supports_all_digests = false;
         int rc = keymaster0_device_initialize(mod, dev);
         if (rc == 0 && ((*dev)->flags & KEYMASTER_SUPPORTS_EC) == 0) {
             *supports_ec = false;
@@ -180,9 +183,10 @@
         return rc;
     } else if (mod->module_api_version == KEYMASTER_MODULE_API_VERSION_1_0) {
         *version = 1;
-        return keymaster1_device_initialize(mod, dev);
+        return keymaster1_device_initialize(mod, dev, supports_all_digests);
     } else {
         *version = 2;
+        *supports_all_digests = true;
         return keymaster2_device_initialize(mod, dev);
     }
 }
@@ -353,7 +357,7 @@
 
 // Methods from ::android::hardware::keymaster::V3_0::IKeymasterDevice follow.
 Return<void> KeymasterDevice::getHardwareFeatures(getHardwareFeatures_cb _hidl_cb) {
-    bool is_secure = false;
+    bool is_secure = !(keymaster_device_->flags & KEYMASTER_SOFTWARE_ONLY);
     bool supports_symmetric_cryptography = false;
     bool supports_attestation = false;
 
@@ -363,14 +367,12 @@
     /* Falls through */
     case 1:
         supports_symmetric_cryptography = true;
-    /* Falls through */
-    case 0:
-        is_secure = true;
         break;
     };
 
     _hidl_cb(is_secure, hardware_supports_ec_, supports_symmetric_cryptography,
-             supports_attestation);
+             supports_attestation, hardware_supports_all_digests_,
+             keymaster_device_->common.module->name, keymaster_device_->common.module->author);
     return Void();
 }
 
@@ -519,21 +521,19 @@
 
     for (size_t i = 0; i < attestParams.size(); ++i) {
         switch (attestParams[i].tag) {
-            case Tag::ATTESTATION_ID_BRAND:
-            case Tag::ATTESTATION_ID_DEVICE:
-            case Tag::ATTESTATION_ID_PRODUCT:
-            case Tag::ATTESTATION_ID_SERIAL:
-            case Tag::ATTESTATION_ID_IMEI:
-            case Tag::ATTESTATION_ID_MEID:
-            case Tag::ATTESTATION_ID_MANUFACTURER:
-            case Tag::ATTESTATION_ID_MODEL:
-                // Device id attestation may only be supported if the device is able to permanently
-                // destroy its knowledge of the ids. This device is unable to do this, so it must
-                // never perform any device id attestation.
-                _hidl_cb(ErrorCode::CANNOT_ATTEST_IDS, resultCertChain);
-                return Void();
-            default:
-                break;
+        case Tag::ATTESTATION_ID_BRAND:
+        case Tag::ATTESTATION_ID_DEVICE:
+        case Tag::ATTESTATION_ID_PRODUCT:
+        case Tag::ATTESTATION_ID_SERIAL:
+        case Tag::ATTESTATION_ID_IMEI:
+        case Tag::ATTESTATION_ID_MEID:
+            // Device id attestation may only be supported if the device is able to permanently
+            // destroy its knowledge of the ids. This device is unable to do this, so it must
+            // never perform any device id attestation.
+            _hidl_cb(ErrorCode::CANNOT_ATTEST_IDS, resultCertChain);
+            return Void();
+        default:
+            break;
         }
     }
 
@@ -703,7 +703,8 @@
 
     uint32_t version;
     bool supports_ec;
-    auto rc = keymaster_device_initialize(&dev, &version, &supports_ec);
+    bool supports_all_digests;
+    auto rc = keymaster_device_initialize(&dev, &version, &supports_ec, &supports_all_digests);
     if (rc) return nullptr;
 
     auto kmrc = ::keymaster::ConfigureDevice(dev);
@@ -712,7 +713,7 @@
         return nullptr;
     }
 
-    return new KeymasterDevice(dev, version, supports_ec);
+    return new KeymasterDevice(dev, version, supports_ec, supports_all_digests);
 }
 
 }  // namespace implementation
diff --git a/keymaster/3.0/default/KeymasterDevice.h b/keymaster/3.0/default/KeymasterDevice.h
index 382f45f..e048d5b 100644
--- a/keymaster/3.0/default/KeymasterDevice.h
+++ b/keymaster/3.0/default/KeymasterDevice.h
@@ -44,9 +44,11 @@
 
 class KeymasterDevice : public IKeymasterDevice {
   public:
-    KeymasterDevice(keymaster2_device_t* dev, uint32_t hardware_version, bool hardware_supports_ec)
+    KeymasterDevice(keymaster2_device_t* dev, uint32_t hardware_version, bool hardware_supports_ec,
+                    bool hardware_supports_all_digests)
         : keymaster_device_(dev), hardware_version_(hardware_version),
-          hardware_supports_ec_(hardware_supports_ec) {}
+          hardware_supports_ec_(hardware_supports_ec),
+          hardware_supports_all_digests_(hardware_supports_all_digests) {}
     virtual ~KeymasterDevice();
 
     // Methods from ::android::hardware::keymaster::V3_0::IKeymasterDevice follow.
@@ -85,6 +87,7 @@
     keymaster2_device_t* keymaster_device_;
     uint32_t hardware_version_;
     bool hardware_supports_ec_;
+    bool hardware_supports_all_digests_;
 };
 
 extern "C" IKeymasterDevice* HIDL_FETCH_IKeymasterDevice(const char* name);
diff --git a/nfc/1.0/Android.bp b/nfc/1.0/Android.bp
index e7305b4..7ee3a9e 100644
--- a/nfc/1.0/Android.bp
+++ b/nfc/1.0/Android.bp
@@ -32,6 +32,7 @@
     ],
     out: [
         "android/hardware/nfc/1.0/types.h",
+        "android/hardware/nfc/1.0/hwtypes.h",
         "android/hardware/nfc/1.0/INfc.h",
         "android/hardware/nfc/1.0/IHwNfc.h",
         "android/hardware/nfc/1.0/BnHwNfc.h",
diff --git a/radio/1.0/Android.bp b/radio/1.0/Android.bp
index f59cf66..e457795 100644
--- a/radio/1.0/Android.bp
+++ b/radio/1.0/Android.bp
@@ -38,6 +38,7 @@
     ],
     out: [
         "android/hardware/radio/1.0/types.h",
+        "android/hardware/radio/1.0/hwtypes.h",
         "android/hardware/radio/1.0/IRadio.h",
         "android/hardware/radio/1.0/IHwRadio.h",
         "android/hardware/radio/1.0/BnHwRadio.h",
diff --git a/radio/1.0/IRadioResponse.hal b/radio/1.0/IRadioResponse.hal
index d21bf0b..42e53a7 100644
--- a/radio/1.0/IRadioResponse.hal
+++ b/radio/1.0/IRadioResponse.hal
@@ -28,7 +28,6 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      */
     oneway getIccCardStatusResponse(RadioResponseInfo info, CardStatus cardStatus);
 
@@ -38,9 +37,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT
      */
     oneway supplyIccPinForAppResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -51,9 +48,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT (PUK is invalid)
      */
     oneway supplyIccPukForAppResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -64,9 +59,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT
      */
     oneway supplyIccPin2ForAppResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -76,9 +69,7 @@
      * @param remainingRetries Number of retries remaining, must be equal to -1 if unknown.
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT (PUK is invalid)
      */
     oneway supplyIccPuk2ForAppResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -89,9 +80,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT
      */
     oneway changeIccPinForAppResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -102,9 +91,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT (old PIN2 is invalid)
      */
     oneway changeIccPin2ForAppResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -115,9 +102,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:PASSWORD_INCORRECT (code is invalid)
      */
     oneway supplyNetworkDepersonalizationResponse(RadioResponseInfo info, int32_t remainingRetries);
@@ -128,7 +113,6 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
      *   RadioError:GENERIC_FAILURE (request will be made again in a few hundred msec)
      *   RadioError:NO_MEMORY
@@ -141,7 +125,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:DIAL_MODIFIED_TO_USSD
      *   RadioError:DIAL_MODIFIED_TO_SS
      *   RadioError:DIAL_MODIFIED_TO_DIAL
@@ -167,9 +150,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE (radio resetting)
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getIMSIForAppResponse(RadioResponseInfo info, string imsi);
 
@@ -185,7 +166,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_CALL_ID
-     *   RadioError:GENERIC_FAILURE
      */
     oneway hangupConnectionResponse(RadioResponseInfo info);
 
@@ -203,7 +183,6 @@
      *   RadioError:NO_RESOURCES
      *   RadioError:OPERATION_NOT_ALLOWED
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway hangupWaitingOrBackgroundResponse(RadioResponseInfo info);
 
@@ -221,7 +200,6 @@
      *   RadioError:NO_RESOURCES
      *   RadioError:OPERATION_NOT_ALLOWED
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway hangupForegroundResumeBackgroundResponse(RadioResponseInfo info);
 
@@ -239,7 +217,6 @@
      *   RadioError:INVALID_CALL_ID
      *   RadioError:OPERATION_NOT_ALLOWED
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway switchWaitingOrHoldingAndActiveResponse(RadioResponseInfo info);
 
@@ -256,7 +233,6 @@
      *   RadioError:INVALID_CALL_ID
      *   RadioError:OPERATION_NOT_ALLOWED
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway conferenceResponse(RadioResponseInfo info);
 
@@ -274,7 +250,6 @@
      *   RadioError:INVALID_CALL_ID
      *   RadioError:OPERATION_NOT_ALLOWED
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway rejectCallResponse(RadioResponseInfo info);
 
@@ -316,10 +291,8 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:NO_MEMORY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getLastCallFailCauseResponse(RadioResponseInfo info,
             LastCallFailCauseInfo failCauseinfo);
@@ -330,7 +303,6 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      */
     oneway getSignalStrengthResponse(RadioResponseInfo info, SignalStrength sigStrength);
@@ -342,9 +314,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getVoiceRegistrationStateResponse(RadioResponseInfo info,
             VoiceRegStateResult voiceRegResponse);
@@ -356,9 +326,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getDataRegistrationStateResponse(RadioResponseInfo info,
             DataRegStateResult dataRegResponse);
@@ -371,9 +339,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getOperatorResponse(RadioResponseInfo info, string longName, string shortName,
             string numeric);
@@ -383,9 +349,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:OPERATION_NOT_ALLOWED
      */
     oneway setRadioPowerResponse(RadioResponseInfo info);
@@ -401,7 +365,6 @@
      *   RadioError:NO_MEMORY
      *   RadioError:MODEM_ERR
      *   RadioError:INVALID_CALL_ID
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendDtmfResponse(RadioResponseInfo info);
 
@@ -425,7 +388,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:NETWORK_ERR
      *   RadioError:MODE_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendSmsResponse(RadioResponseInfo info, SendSmsResult sms);
 
@@ -450,7 +412,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:NETWORK_ERR
      *   RadioError:MODE_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendSMSExpectMoreResponse(RadioResponseInfo info, SendSmsResult sms);
 
@@ -462,12 +423,10 @@
      *   RadioError:NONE must be returned on both success and failure of setup with the
      *              DataCallResponse.status containing the actual status
      *              For all other errors the DataCallResponse is ignored.
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:OP_NOT_ALLOWED_BEFORE_REG_TO_NW
      *   RadioError:OP_NOT_ALLOWED_DURING_VOICE_CALL
      *   RadioError:REQUEST_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setupDataCallResponse(RadioResponseInfo info, SetupDataCallResult dcResponse);
 
@@ -477,11 +436,9 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SIM_PIN2
      *   RadioError:SIM_PUK2
-     *   RadioError:GENERIC_FAILURE
      */
     oneway iccIOForAppResponse(RadioResponseInfo info, IccIoResult iccIo);
 
@@ -504,7 +461,6 @@
      *   RadioError:ABORTED
      *   RadioError:SYSTEM_ERR
      *   RadioError:INVALID_STATE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendUssdResponse(RadioResponseInfo info);
 
@@ -513,7 +469,6 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SIM_BUSY
      *   RadioError:OPERATION_NOT_ALLOWED
@@ -521,7 +476,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:NO_MEMORY
      *   RadioError:INVALID_STATE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway cancelPendingUssdResponse(RadioResponseInfo info);
 
@@ -532,7 +486,6 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SS_MODIFIED_TO_DIAL
      *   RadioError:SS_MODIFIED_TO_USSD
@@ -542,7 +495,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:FDN_CHECK_FAILURE
      *   RadioError:SYSTEM_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getClirResponse(RadioResponseInfo info, int32_t n, int32_t m);
 
@@ -558,7 +510,6 @@
      *   RadioError:SS_MODIFIED_TO_SS
      *   RadioError:INVALID_ARGUMENTS
      *   RadioError:SYSTEM_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setClirResponse(RadioResponseInfo info);
 
@@ -586,7 +537,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCallForwardStatusResponse(RadioResponseInfo info,
             vec<CallForwardInfo> callForwardInfos);
@@ -607,7 +557,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_STATE
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCallForwardResponse(RadioResponseInfo info);
 
@@ -632,7 +581,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCallWaitingResponse(RadioResponseInfo info, bool enable, int32_t serviceClass);
 
@@ -651,7 +599,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_STATE
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCallWaitingResponse(RadioResponseInfo info);
 
@@ -660,9 +607,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway acknowledgeLastIncomingGsmSmsResponse(RadioResponseInfo info);
 
@@ -671,7 +616,6 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:INVALID_STATE
      *   RadioError:NO_MEMORY
@@ -679,7 +623,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_CALL_ID
-     *   RadioError:GENERIC_FAILURE
      */
     oneway acceptCallResponse(RadioResponseInfo info);
 
@@ -688,9 +631,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway deactivateDataCallResponse(RadioResponseInfo info);
 
@@ -712,7 +653,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:SYSTEM_ERR
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getFacilityLockForAppResponse(RadioResponseInfo info, int32_t response);
 
@@ -732,7 +672,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_STATE
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setFacilityLockForAppResponse(RadioResponseInfo info, int32_t retry);
 
@@ -751,7 +690,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:SYSTEM_ERR
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setBarringPasswordResponse(RadioResponseInfo info);
 
@@ -761,9 +699,7 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getNetworkSelectionModeResponse(RadioResponseInfo info, bool manual);
 
@@ -772,11 +708,9 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:ILLEGAL_SIM_OR_ME
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      *
      * Returns RadioError:ILLEGAL_SIM_OR_ME when the failure is permanent and
      * no retries needed, such as illegal SIM or ME.
@@ -789,11 +723,9 @@
      *
      * Valid errors returned:
      *   RadioError:NONE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:ILLEGAL_SIM_OR_ME
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      *
      * Returns RadioError:ILLEGAL_SIM_OR_ME when the failure is permanent and
      * no retries needed, such as illegal SIM or ME.
@@ -832,7 +764,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_CALL_ID
-     *   RadioError:GENERIC_FAILURE
      */
     oneway startDtmfResponse(RadioResponseInfo info);
 
@@ -850,7 +781,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_CALL_ID
-     *   RadioError:GENERIC_FAILURE
      */
     oneway stopDtmfResponse(RadioResponseInfo info);
 
@@ -861,9 +791,7 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:EMPTY_RECORD
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getBasebandVersionResponse(RadioResponseInfo info, string version);
 
@@ -882,7 +810,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_CALL_ID
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway separateConnectionResponse(RadioResponseInfo info);
 
@@ -895,7 +822,6 @@
      *   RadioError:INVALID_ARGUMENTS
      *   RadioError:NO_MEMORY
      *   RadioError:REQUEST_RATE_LIMITED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setMuteResponse(RadioResponseInfo info);
 
@@ -906,13 +832,11 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:SS_MODIFIED_TO_DIAL
      *   RadioError:SS_MODIFIED_TO_USSD
      *   RadioError:SS_MODIFIED_TO_SS
      *   RadioError:NO_MEMORY
      *   RadioError:REQUEST_RATE_LIMITED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getMuteResponse(RadioResponseInfo info, bool enable);
 
@@ -929,7 +853,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:FDN_CHECK_FAILURE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getClipResponse(RadioResponseInfo info, ClipStatus status);
 
@@ -940,8 +863,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getDataCallListResponse(RadioResponseInfo info, vec<SetupDataCallResult> dcResponse);
 
@@ -957,7 +878,6 @@
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setSuppServiceNotificationsResponse(RadioResponseInfo info);
 
@@ -978,7 +898,6 @@
      *   RadioError:INVALID_MODEM_STATE
      *   RadioError:MODE_NOT_SUPPORTED
      *   RadioError:INVALID_SMSC_ADDRESS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway writeSmsToSimResponse(RadioResponseInfo info, int32_t index);
 
@@ -994,7 +913,6 @@
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
      *   RadioError:NO_SUCH_ENTRY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway deleteSmsOnSimResponse(RadioResponseInfo info);
 
@@ -1004,9 +922,7 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setBandModeResponse(RadioResponseInfo info);
 
@@ -1018,7 +934,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getAvailableBandModesResponse(RadioResponseInfo info, vec<RadioBandMode> bandModes);
 
@@ -1030,10 +945,8 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:SIM_BUSY
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendEnvelopeResponse(RadioResponseInfo info, string commandResponse);
 
@@ -1045,7 +958,6 @@
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:INVALID_ARGUMENTS
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendTerminalResponseToSimResponse(RadioResponseInfo info);
 
@@ -1057,7 +969,6 @@
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:INVALID_ARGUMENTS
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway handleStkCallSetupRequestFromSimResponse(RadioResponseInfo info);
 
@@ -1076,7 +987,6 @@
      *   RadioError:INTERNAL_ERR
      *   RadioError:INVALID_CALL_ID
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway explicitCallTransferResponse(RadioResponseInfo info);
 
@@ -1086,10 +996,8 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:OPERATION_NOT_ALLOWED
      *   RadioError:MODE_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setPreferredNetworkTypeResponse(RadioResponseInfo info);
 
@@ -1100,8 +1008,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getPreferredNetworkTypeResponse(RadioResponseInfo info,
             PreferredNetworkType nwType);
@@ -1114,7 +1020,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getNeighboringCidsResponse(RadioResponseInfo info, vec<NeighboringCell> cells);
 
@@ -1124,8 +1029,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setLocationUpdatesResponse(RadioResponseInfo info);
 
@@ -1135,10 +1038,8 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:SIM_ABSENT
      *   RadioError:SUBSCRIPTION_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCdmaSubscriptionSourceResponse(RadioResponseInfo info);
 
@@ -1148,8 +1049,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCdmaRoamingPreferenceResponse(RadioResponseInfo info);
 
@@ -1161,7 +1060,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCdmaRoamingPreferenceResponse(RadioResponseInfo info, CdmaRoamingType type);
 
@@ -1175,7 +1073,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:NO_MEMORY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setTTYModeResponse(RadioResponseInfo info);
 
@@ -1190,7 +1087,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:NO_MEMORY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getTTYModeResponse(RadioResponseInfo info, TtyMode mode);
 
@@ -1204,7 +1100,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:NO_MEMORY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setPreferredVoicePrivacyResponse(RadioResponseInfo info);
 
@@ -1220,7 +1115,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INTERNAL_ERR
      *   RadioError:NO_MEMORY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getPreferredVoicePrivacyResponse(RadioResponseInfo info, bool enable);
 
@@ -1239,7 +1133,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INVALID_CALL_ID
      *   RadioError:INVALID_STATE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendCDMAFeatureCodeResponse(RadioResponseInfo info);
 
@@ -1256,7 +1149,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INVALID_CALL_ID
      *   RadioError:INVALID_STATE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendBurstDtmfResponse(RadioResponseInfo info);
 
@@ -1281,7 +1173,6 @@
      *   RadioError:ENCODING_ERR
      *   RadioError:INVALID_SMSC_ADDRESS
      *   RadioError:MODE_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendCdmaSmsResponse(RadioResponseInfo info, SendSmsResult sms);
 
@@ -1301,7 +1192,6 @@
      *   RadioError:MODE_NOT_SUPPORTED
      *   RadioError:NETWORK_NOT_READY
      *   RadioError:INVALID_MODEM_STATE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway acknowledgeLastIncomingCdmaSmsResponse(RadioResponseInfo info);
 
@@ -1319,7 +1209,6 @@
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
      *   RadioError:NO_RESOURCES
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getGsmBroadcastConfigResponse(RadioResponseInfo info,
             vec<GsmBroadcastSmsConfigInfo> configs);
@@ -1336,7 +1225,6 @@
      *   RadioError:REQUEST_RATE_LIMITED
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setGsmBroadcastConfigResponse(RadioResponseInfo info);
 
@@ -1352,7 +1240,6 @@
      *   RadioError:REQUEST_RATE_LIMITED
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setGsmBroadcastActivationResponse(RadioResponseInfo info);
 
@@ -1370,7 +1257,6 @@
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
      *   RadioError:NO_RESOURCES
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCdmaBroadcastConfigResponse(RadioResponseInfo info,
             vec<CdmaBroadcastSmsConfigInfo> configs);
@@ -1387,7 +1273,6 @@
      *   RadioError:REQUEST_RATE_LIMITED
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCdmaBroadcastConfigResponse(RadioResponseInfo info);
 
@@ -1403,7 +1288,6 @@
      *   RadioError:REQUEST_RATE_LIMITED
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCdmaBroadcastActivationResponse(RadioResponseInfo info);
 
@@ -1420,9 +1304,7 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:SUBSCRIPTION_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCDMASubscriptionResponse(RadioResponseInfo info, string mdn, string hSid,
             string hNid, string min, string prl);
@@ -1445,7 +1327,6 @@
      *   RadioError:INVALID_MODEM_STATE
      *   RadioError:MODE_NOT_SUPPORTED
      *   RadioError:INVALID_SMSC_ADDRESS
-     *   RadioError:GENERIC_FAILURE
      */
     oneway writeSmsToRuimResponse(RadioResponseInfo info, uint32_t index);
 
@@ -1461,7 +1342,6 @@
      *   RadioError:SYSTEM_ERR
      *   RadioError:MODEM_ERR
      *   RadioError:NO_SUCH_ENTRY
-     *   RadioError:GENERIC_FAILURE
      */
     oneway deleteSmsOnRuimResponse(RadioResponseInfo info);
 
@@ -1475,8 +1355,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
-     *   RadioError:GENERIC_FAILURE
      *
      * If a empty string value is returned for any of the device id, it means that there was error
      * accessing the device.
@@ -1491,9 +1369,7 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:INVALID_ARGUMENTS
      *   RadioError:OPERATION_NO_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway exitEmergencyCallbackModeResponse(RadioResponseInfo info);
 
@@ -1512,7 +1388,6 @@
      *   RadioError:MODEM_ERR
      *   RadioError:INVALID_MODEM_STATE
      *   RadioError:NOT_PROVISIONED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getSmscAddressResponse(RadioResponseInfo info, string smsc);
 
@@ -1529,7 +1404,6 @@
      *   RadioError:REQUEST_RATE_LIMITED
      *   RadioError:MODEM_ERR
      *   RadioError:NO_RESOURCES
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setSmscAddressResponse(RadioResponseInfo info);
 
@@ -1545,7 +1419,6 @@
      *   RadioError:REQUEST_RATE_LIMITED
      *   RadioError:MODEM_ERR
      *   RadioError:INVALID_STATE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway reportSmsMemoryStatusResponse(RadioResponseInfo info);
 
@@ -1555,7 +1428,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway reportStkServiceIsRunningResponse(RadioResponseInfo info);
 
@@ -1567,7 +1439,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SUBSCRIPTION_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCdmaSubscriptionSourceResponse(RadioResponseInfo info, CdmaSubscriptionSource source);
 
@@ -1578,7 +1449,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway requestIsimAuthenticationResponse(RadioResponseInfo info, string response);
 
@@ -1588,7 +1458,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway acknowledgeIncomingGsmSmsWithPduResponse(RadioResponseInfo info);
 
@@ -1601,7 +1470,6 @@
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SIM_BUSY
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendEnvelopeWithStatusResponse(RadioResponseInfo info, IccIoResult iccIo);
 
@@ -1612,7 +1480,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getVoiceRadioTechnologyResponse(RadioResponseInfo info, RadioTechnology rat);
 
@@ -1623,7 +1490,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getCellInfoListResponse(RadioResponseInfo info, vec<CellInfo> cellInfo);
 
@@ -1633,7 +1499,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setCellInfoListRateResponse(RadioResponseInfo info);
 
@@ -1644,7 +1509,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SUBSCRIPTION_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setInitialAttachApnResponse(RadioResponseInfo info);
 
@@ -1657,7 +1521,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getImsRegistrationStateResponse(RadioResponseInfo info, bool isRegistered,
             RadioTechnologyFamily ratFamily);
@@ -1682,7 +1545,6 @@
      *   RadioError:NETWORK_ERR
      *   RadioError:ENCODING_ERR
      *   RadioError:MODE_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway sendImsSmsResponse(RadioResponseInfo info, SendSmsResult sms);
 
@@ -1693,7 +1555,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway iccTransmitApduBasicChannelResponse(RadioResponseInfo info, IccIoResult result);
 
@@ -1706,7 +1567,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      *   RadioError:MISSING_RESOURCE
      *   RadioError:NO_SUCH_ELEMENT
      */
@@ -1719,7 +1579,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway iccCloseLogicalChannelResponse(RadioResponseInfo info);
 
@@ -1730,7 +1589,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway iccTransmitApduLogicalChannelResponse(RadioResponseInfo info, IccIoResult result);
 
@@ -1741,7 +1599,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway nvReadItemResponse(RadioResponseInfo info, string result);
 
@@ -1751,7 +1608,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway nvWriteItemResponse(RadioResponseInfo info);
 
@@ -1761,7 +1617,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway nvWriteCdmaPrlResponse(RadioResponseInfo info);
 
@@ -1771,7 +1626,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway nvResetConfigResponse(RadioResponseInfo info);
 
@@ -1782,7 +1636,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:SUBSCRIPTION_NOT_SUPPORTED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setUiccSubscriptionResponse(RadioResponseInfo info);
 
@@ -1792,7 +1645,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setDataAllowedResponse(RadioResponseInfo info);
 
@@ -1833,7 +1685,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway requestShutdownResponse(RadioResponseInfo info);
 
@@ -1845,7 +1696,6 @@
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getRadioCapabilityResponse(RadioResponseInfo info, RadioCapability rc);
 
@@ -1858,7 +1708,6 @@
      *   RadioError:NONE means a unsol radioCapability() will be sent within 30 seconds.
      *   RadioError:RADIO_NOT_AVAILABLE
      *   RadioError:OPERATION_NOT_ALLOWED
-     *   RadioError:GENERIC_FAILURE
      */
     oneway setRadioCapabilityResponse(RadioResponseInfo info, RadioCapability rc);
 
@@ -1902,7 +1751,6 @@
      * Valid errors returned:
      *   RadioError:NONE
      *   RadioError:RADIO_NOT_AVAILABLE
-     *   RadioError:GENERIC_FAILURE
      */
     oneway getModemActivityInfoResponse(RadioResponseInfo info, ActivityStatsInfo activityInfo);
 
diff --git a/renderscript/1.0/Android.bp b/renderscript/1.0/Android.bp
index cce34e7..9f2a589 100644
--- a/renderscript/1.0/Android.bp
+++ b/renderscript/1.0/Android.bp
@@ -32,6 +32,7 @@
     ],
     out: [
         "android/hardware/renderscript/1.0/types.h",
+        "android/hardware/renderscript/1.0/hwtypes.h",
         "android/hardware/renderscript/1.0/IContext.h",
         "android/hardware/renderscript/1.0/IHwContext.h",
         "android/hardware/renderscript/1.0/BnHwContext.h",
diff --git a/sensors/1.0/default/android.hardware.sensors@1.0-service.rc b/sensors/1.0/default/android.hardware.sensors@1.0-service.rc
index 2360863..50cf787 100644
--- a/sensors/1.0/default/android.hardware.sensors@1.0-service.rc
+++ b/sensors/1.0/default/android.hardware.sensors@1.0-service.rc
@@ -1,4 +1,4 @@
 service sensors-hal-1-0 /vendor/bin/hw/android.hardware.sensors@1.0-service
     class main
     user system
-    group system readproc
+    group system
diff --git a/tests/bar/1.0/Android.bp b/tests/bar/1.0/Android.bp
index 694804c..2edde20 100644
--- a/tests/bar/1.0/Android.bp
+++ b/tests/bar/1.0/Android.bp
@@ -38,6 +38,7 @@
     ],
     out: [
         "android/hardware/tests/bar/1.0/types.h",
+        "android/hardware/tests/bar/1.0/hwtypes.h",
         "android/hardware/tests/bar/1.0/IBar.h",
         "android/hardware/tests/bar/1.0/IHwBar.h",
         "android/hardware/tests/bar/1.0/BnHwBar.h",
diff --git a/tests/baz/1.0/Android.bp b/tests/baz/1.0/Android.bp
index 7939444..8f327e3 100644
--- a/tests/baz/1.0/Android.bp
+++ b/tests/baz/1.0/Android.bp
@@ -34,6 +34,7 @@
     ],
     out: [
         "android/hardware/tests/baz/1.0/types.h",
+        "android/hardware/tests/baz/1.0/hwtypes.h",
         "android/hardware/tests/baz/1.0/IBase.h",
         "android/hardware/tests/baz/1.0/IHwBase.h",
         "android/hardware/tests/baz/1.0/BnHwBase.h",
diff --git a/tests/foo/1.0/Android.bp b/tests/foo/1.0/Android.bp
index 9572855..b221201 100644
--- a/tests/foo/1.0/Android.bp
+++ b/tests/foo/1.0/Android.bp
@@ -38,6 +38,7 @@
     ],
     out: [
         "android/hardware/tests/foo/1.0/types.h",
+        "android/hardware/tests/foo/1.0/hwtypes.h",
         "android/hardware/tests/foo/1.0/IFoo.h",
         "android/hardware/tests/foo/1.0/IHwFoo.h",
         "android/hardware/tests/foo/1.0/BnHwFoo.h",
diff --git a/thermal/1.0/default/android.hardware.thermal@1.0-service.rc b/thermal/1.0/default/android.hardware.thermal@1.0-service.rc
index f8da101..cbc0f65 100644
--- a/thermal/1.0/default/android.hardware.thermal@1.0-service.rc
+++ b/thermal/1.0/default/android.hardware.thermal@1.0-service.rc
@@ -1,4 +1,4 @@
 service thermal-hal-1-0 /vendor/bin/hw/android.hardware.thermal@1.0-service
     class hal
     user system
-    group system readproc
+    group system
diff --git a/tv/input/1.0/Android.mk b/tv/input/1.0/Android.mk
index f9e3276..87654da 100644
--- a/tv/input/1.0/Android.mk
+++ b/tv/input/1.0/Android.mk
@@ -1,19 +1,41 @@
-#
-# 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.
-#
+# This file is autogenerated by hidl-gen. Do not edit manually.
 
 LOCAL_PATH := $(call my-dir)
 
-include $(call all-subdir-makefiles)
+################################################################################
+
+include $(CLEAR_VARS)
+LOCAL_MODULE := android.hardware.tv.input@1.0-java-constants
+LOCAL_MODULE_CLASS := JAVA_LIBRARIES
+
+intermediates := $(call local-generated-sources-dir, COMMON)
+
+HIDL := $(HOST_OUT_EXECUTABLES)/hidl-gen$(HOST_EXECUTABLE_SUFFIX)
+#
+GEN := $(intermediates)/android/hardware/tv/input/V1_0/Constants.java
+$(GEN): $(HIDL)
+$(GEN): $(LOCAL_PATH)/types.hal
+$(GEN): $(LOCAL_PATH)/ITvInput.hal
+$(GEN): $(LOCAL_PATH)/ITvInputCallback.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.tv.input@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/tv/input/1.0/default/TvInput.cpp b/tv/input/1.0/default/TvInput.cpp
index 0bc6401..4ea1dec 100644
--- a/tv/input/1.0/default/TvInput.cpp
+++ b/tv/input/1.0/default/TvInput.cpp
@@ -19,8 +19,6 @@
 
 #include "TvInput.h"
 
-const native_handle_t kNullNativeHandle{sizeof(native_handle_t), 0, 0, {}};
-
 namespace android {
 namespace hardware {
 namespace tv {
@@ -117,8 +115,6 @@
             sidebandStream = stream.sideband_stream_source_handle;
         }
     } else {
-        // TODO(b/30814137)
-        sidebandStream = const_cast<native_handle_t*>(&kNullNativeHandle);
         if (ret == -EBUSY) {
             res = Result::NO_RESOURCE;
         } else if (ret == -EEXIST) {
diff --git a/tv/input/1.0/default/android.hardware.tv.input@1.0-service.rc b/tv/input/1.0/default/android.hardware.tv.input@1.0-service.rc
index 9edeba6..dc6907c 100644
--- a/tv/input/1.0/default/android.hardware.tv.input@1.0-service.rc
+++ b/tv/input/1.0/default/android.hardware.tv.input@1.0-service.rc
@@ -1,4 +1,4 @@
 service tv-input-1-0 /vendor/bin/hw/android.hardware.tv.input@1.0-service
     class hal
     user system
-    group system readproc
+    group system
diff --git a/tv/input/1.0/types.hal b/tv/input/1.0/types.hal
index 55eb6ad..60a3b7b 100644
--- a/tv/input/1.0/types.hal
+++ b/tv/input/1.0/types.hal
@@ -27,6 +27,7 @@
 };
 
 /* Type of physical TV input. */
+@export(name="", value_prefix="TV_INPUT_TYPE_")
 enum TvInputType : int32_t {
     OTHER = 1,         // Generic hardware.
     TUNER = 2,         // Tuner. e.g. built-in terrestrial tuner
@@ -46,6 +47,7 @@
  * regardless of whether the connected external device is electrically on or not.
  * If the device does not have such capability, you must use UNKNOWN.
  */
+@export(name="", value_prefix="CABLE_CONNECTION_STATUS_")
 enum CableConnectionStatus : int32_t {
     UNKNOWN = 0,
     CONNECTED = 1,
@@ -63,6 +65,7 @@
                                                  // must be filled with 0s.
 };
 
+@export(name="", value_prefix="EVENT_")
 enum TvInputEventType : int32_t {
     /*
      * Hardware notifies the framework that a device is available.
diff --git a/vibrator/1.0/default/android.hardware.vibrator@1.0-service.rc b/vibrator/1.0/default/android.hardware.vibrator@1.0-service.rc
index 4153c44..f027065 100644
--- a/vibrator/1.0/default/android.hardware.vibrator@1.0-service.rc
+++ b/vibrator/1.0/default/android.hardware.vibrator@1.0-service.rc
@@ -1,4 +1,4 @@
 service vibrator-1-0 /vendor/bin/hw/android.hardware.vibrator@1.0-service
     class hal
     user system
-    group system readproc
+    group system
diff --git a/vr/1.0/default/android.hardware.vr@1.0-service.rc b/vr/1.0/default/android.hardware.vr@1.0-service.rc
index ba43302..bcc6416 100644
--- a/vr/1.0/default/android.hardware.vr@1.0-service.rc
+++ b/vr/1.0/default/android.hardware.vr@1.0-service.rc
@@ -1,4 +1,4 @@
 service vr-1-0 /vendor/bin/hw/android.hardware.vr@1.0-service
     class hal
     user system
-    group system readproc
+    group system
diff --git a/wifi/1.0/Android.bp b/wifi/1.0/Android.bp
index 2319999..df5c9d2 100644
--- a/wifi/1.0/Android.bp
+++ b/wifi/1.0/Android.bp
@@ -54,6 +54,7 @@
     ],
     out: [
         "android/hardware/wifi/1.0/types.h",
+        "android/hardware/wifi/1.0/hwtypes.h",
         "android/hardware/wifi/1.0/IWifi.h",
         "android/hardware/wifi/1.0/IHwWifi.h",
         "android/hardware/wifi/1.0/BnHwWifi.h",
diff --git a/wifi/1.0/default/Android.mk b/wifi/1.0/default/Android.mk
index cc5e1c6..13f6cc1 100644
--- a/wifi/1.0/default/Android.mk
+++ b/wifi/1.0/default/Android.mk
@@ -48,6 +48,5 @@
     libwifi-hal \
     libwifi-system \
     libcld80211
-LOCAL_WHOLE_STATIC_LIBRARIES := $(LIB_WIFI_HAL)
 LOCAL_INIT_RC := android.hardware.wifi@1.0-service.rc
 include $(BUILD_EXECUTABLE)
diff --git a/wifi/1.0/vts/functional/Android.bp b/wifi/1.0/vts/functional/Android.bp
index 9403e98..b454a06 100644
--- a/wifi/1.0/vts/functional/Android.bp
+++ b/wifi/1.0/vts/functional/Android.bp
@@ -17,7 +17,7 @@
 cc_library_static {
     name: "VtsHalWifiV1_0TargetTestUtil",
     srcs: [
-        "VtsHalWifiV1_0TargetTest.cpp",
+
         "wifi_hidl_call_util_selftest.cpp",
         "wifi_hidl_test.cpp",
         "wifi_hidl_test_utils.cpp"],
@@ -38,6 +38,7 @@
     name: "VtsHalWifiV1_0TargetTest",
     defaults: ["hidl_defaults"],
     srcs: [
+        "VtsHalWifiV1_0TargetTest.cpp",
         "wifi_ap_iface_hidl_test.cpp",
         "wifi_chip_hidl_test.cpp",
         "wifi_p2p_iface_hidl_test.cpp",
@@ -63,7 +64,9 @@
 cc_test {
     name: "VtsHalWifiNanV1_0TargetTest",
     defaults: ["hidl_defaults"],
-    srcs: ["wifi_nan_iface_hidl_test.cpp"],
+    srcs: [
+        "VtsHalWifiV1_0TargetTest.cpp",
+        "wifi_nan_iface_hidl_test.cpp"],
     shared_libs: [
         "libbase",
         "liblog",
diff --git a/wifi/1.0/vts/functional/VtsHalWifiV1_0TargetTest.cpp b/wifi/1.0/vts/functional/VtsHalWifiV1_0TargetTest.cpp
index b56ed2b..160fcd2 100644
--- a/wifi/1.0/vts/functional/VtsHalWifiV1_0TargetTest.cpp
+++ b/wifi/1.0/vts/functional/VtsHalWifiV1_0TargetTest.cpp
@@ -20,14 +20,6 @@
 
 #include "wifi_hidl_test_utils.h"
 
-class WifiHidlEnvironment : public ::testing::Environment {
-   public:
-    virtual void SetUp() override { stopFramework(); }
-    virtual void TearDown() override { startFramework(); }
-
-   private:
-};
-
 int main(int argc, char** argv) {
     ::testing::AddGlobalTestEnvironment(new WifiHidlEnvironment);
     ::testing::InitGoogleTest(&argc, argv);
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 2d0b081..fefbd79 100644
--- a/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
+++ b/wifi/1.0/vts/functional/wifi_hidl_test_utils.cpp
@@ -82,14 +82,6 @@
 }
 }  // namespace
 
-void stopFramework() {
-    ASSERT_EQ(std::system("stop"), 0);
-    stopWifi();
-    sleep(5);
-}
-
-void startFramework() { ASSERT_EQ(std::system("start"), 0); }
-
 sp<IWifi> getWifi() {
     sp<IWifi> wifi = ::testing::VtsHalHidlTargetTestBase::getService<IWifi>();
     return wifi;
diff --git a/wifi/1.0/vts/functional/wifi_hidl_test_utils.h b/wifi/1.0/vts/functional/wifi_hidl_test_utils.h
index a723b2a..39a0eba 100644
--- a/wifi/1.0/vts/functional/wifi_hidl_test_utils.h
+++ b/wifi/1.0/vts/functional/wifi_hidl_test_utils.h
@@ -24,11 +24,6 @@
 #include <android/hardware/wifi/1.0/IWifiRttController.h>
 #include <android/hardware/wifi/1.0/IWifiStaIface.h>
 
-// Used to stop the android framework (wifi service) before every
-// test.
-void stopFramework();
-void startFramework();
-
 // Helper functions to obtain references to the various HIDL interface objects.
 // Note: We only have a single instance of each of these objects currently.
 // These helper functions should be modified to return vectors if we support
@@ -49,3 +44,12 @@
     android::hardware::wifi::V1_0::ChipModeId* configured_mode_id);
 // Used to trigger IWifi.stop() at the end of every test.
 void stopWifi();
+
+class WifiHidlEnvironment : public ::testing::Environment {
+ public:
+  virtual void SetUp() override {
+      stopWifi();
+      sleep(5);
+  }
+  virtual void TearDown() override {}
+};
\ No newline at end of file
diff --git a/wifi/supplicant/1.0/Android.bp b/wifi/supplicant/1.0/Android.bp
index a6c2758..a0adb8d 100644
--- a/wifi/supplicant/1.0/Android.bp
+++ b/wifi/supplicant/1.0/Android.bp
@@ -52,6 +52,7 @@
     ],
     out: [
         "android/hardware/wifi/supplicant/1.0/types.h",
+        "android/hardware/wifi/supplicant/1.0/hwtypes.h",
         "android/hardware/wifi/supplicant/1.0/ISupplicant.h",
         "android/hardware/wifi/supplicant/1.0/IHwSupplicant.h",
         "android/hardware/wifi/supplicant/1.0/BnHwSupplicant.h",