diff --git a/bta/av/bta_av_main.cc b/bta/av/bta_av_main.cc
index c8adbe9..ac5ccab 100644
--- a/bta/av/bta_av_main.cc
+++ b/bta/av/bta_av_main.cc
@@ -456,14 +456,14 @@
                         BTA_ID_AV);
 #endif
 
-        /* Both Audio Source and Audio Sink support AVRCP 1.6 for the
-         * major roles (i.e. Audio Source -> TG 1.6 and vice versa). For
+        /* Both Audio Source and Audio Sink support AVRCP 1.4 for the
+         * major roles (i.e. Audio Source -> TG 1.4 and vice versa). For
          * Audio Sink role we support additional TG 1.3 to support
          * absolute volume. Here we only do TG registration.
          */
         uint16_t profile_version = AVRC_REV_1_0;
         if (profile_initialized == UUID_SERVCLASS_AUDIO_SOURCE) {
-          profile_version = AVRC_REV_1_6;
+          profile_version = AVRC_REV_1_4;
         } else if (profile_initialized == UUID_SERVCLASS_AUDIO_SINK) {
           // Initialize AVRCP1.4 to provide Absolute Volume control.
           profile_version = AVRC_REV_1_4;
diff --git a/btif/src/btif_ble_advertiser.cc b/btif/src/btif_ble_advertiser.cc
index f274de2..395bc1d 100644
--- a/btif/src/btif_ble_advertiser.cc
+++ b/btif/src/btif_ble_advertiser.cc
@@ -59,6 +59,29 @@
   return OwnedArrayWrapper<T>(o);
 }
 
+void parseParams(tBTM_BLE_ADV_PARAMS* p_params,
+                 const AdvertiseParameters& params) {
+  p_params->advertising_event_properties = params.advertising_event_properties;
+  p_params->adv_int_min = params.min_interval;
+  p_params->adv_int_max = params.max_interval;
+  p_params->channel_map = params.channel_map;
+  p_params->adv_filter_policy = 0;
+  p_params->tx_power = params.tx_power;
+  p_params->primary_advertising_phy = params.primary_advertising_phy;
+  p_params->secondary_advertising_phy = params.secondary_advertising_phy;
+  p_params->scan_request_notification_enable =
+      params.scan_request_notification_enable;
+}
+
+void parsePeriodicParams(tBLE_PERIODIC_ADV_PARAMS* p_periodic_params,
+                         PeriodicAdvertisingParameters periodic_params) {
+  p_periodic_params->enable = periodic_params.enable;
+  p_periodic_params->min_interval = periodic_params.min_interval;
+  p_periodic_params->max_interval = periodic_params.max_interval;
+  p_periodic_params->periodic_advertising_properties =
+      periodic_params.periodic_advertising_properties;
+}
+
 class BleAdvertiserInterfaceImpl : public BleAdvertiserInterface {
   ~BleAdvertiserInterfaceImpl(){};
 
@@ -84,36 +107,18 @@
              base::Unretained(BleAdvertisingManager::Get()), advertiser_id));
   }
 
-  void SetParametersCb(StatusCallback cb, uint8_t status) {
-    LOG(INFO) << __func__ << " status: " << +status;
-    do_in_jni_thread(Bind(cb, status));
-  }
+  void SetParameters(uint8_t advertiser_id, AdvertiseParameters params,
+                     ParametersCallback cb) override {
+    VLOG(1) << __func__;
 
-  void SetParameters(uint8_t advertiser_id,
-                     uint16_t advertising_event_properties,
-                     uint32_t min_interval, uint32_t max_interval, int chnl_map,
-                     int tx_power, uint8_t primary_advertising_phy,
-                     uint8_t secondary_advertising_phy,
-                     uint8_t scan_request_notification_enable,
-                     StatusCallback cb) {
-    tBTM_BLE_ADV_PARAMS* params = new tBTM_BLE_ADV_PARAMS;
+    tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
+    parseParams(p_params, params);
 
-    params->advertising_event_properties = advertising_event_properties;
-    params->adv_int_min = min_interval;
-    params->adv_int_max = max_interval;
-    params->channel_map = chnl_map;
-    params->adv_filter_policy = 0;
-    params->tx_power = tx_power;
-    params->primary_advertising_phy = primary_advertising_phy;
-    params->secondary_advertising_phy = secondary_advertising_phy;
-    params->scan_request_notification_enable = scan_request_notification_enable;
-
-    do_in_bta_thread(FROM_HERE,
-                     Bind(&BleAdvertisingManager::SetParameters,
-                          base::Unretained(BleAdvertisingManager::Get()),
-                          advertiser_id, base::Owned(params),
-                          Bind(&BleAdvertiserInterfaceImpl::SetParametersCb,
-                               base::Unretained(this), cb)));
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetParameters,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             base::Owned(p_params), jni_thread_wrapper(FROM_HERE, cb)));
   }
 
   void SetData(int advertiser_id, bool set_scan_rsp, vector<uint8_t> data,
@@ -146,17 +151,7 @@
     VLOG(1) << __func__;
 
     tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
-    p_params->advertising_event_properties =
-        params.advertising_event_properties;
-    p_params->adv_int_min = params.min_interval;
-    p_params->adv_int_max = params.max_interval;
-    p_params->channel_map = params.channel_map;
-    p_params->adv_filter_policy = 0;
-    p_params->tx_power = params.tx_power;
-    p_params->primary_advertising_phy = params.primary_advertising_phy;
-    p_params->secondary_advertising_phy = params.secondary_advertising_phy;
-    p_params->scan_request_notification_enable =
-        params.scan_request_notification_enable;
+    parseParams(p_params, params);
 
     do_in_bta_thread(
         FROM_HERE,
@@ -167,33 +162,20 @@
              timeout_s, jni_thread_wrapper(FROM_HERE, timeout_cb)));
   }
 
-  void StartAdvertisingSet(IdStatusCallback cb, AdvertiseParameters params,
+  void StartAdvertisingSet(IdTxPowerStatusCallback cb,
+                           AdvertiseParameters params,
                            std::vector<uint8_t> advertise_data,
                            std::vector<uint8_t> scan_response_data,
                            PeriodicAdvertisingParameters periodic_params,
                            std::vector<uint8_t> periodic_data, int timeout_s,
-                           IdStatusCallback timeout_cb) {
+                           IdStatusCallback timeout_cb) override {
     VLOG(1) << __func__;
 
     tBTM_BLE_ADV_PARAMS* p_params = new tBTM_BLE_ADV_PARAMS;
-    p_params->advertising_event_properties =
-        params.advertising_event_properties;
-    p_params->adv_int_min = params.min_interval;
-    p_params->adv_int_max = params.max_interval;
-    p_params->channel_map = params.channel_map;
-    p_params->adv_filter_policy = 0;
-    p_params->tx_power = params.tx_power;
-    p_params->primary_advertising_phy = params.primary_advertising_phy;
-    p_params->secondary_advertising_phy = params.secondary_advertising_phy;
-    p_params->scan_request_notification_enable =
-        params.scan_request_notification_enable;
+    parseParams(p_params, params);
 
     tBLE_PERIODIC_ADV_PARAMS* p_periodic_params = new tBLE_PERIODIC_ADV_PARAMS;
-    p_periodic_params->enable = periodic_params.enable;
-    p_periodic_params->min_interval = periodic_params.min_interval;
-    p_periodic_params->max_interval = periodic_params.max_interval;
-    p_periodic_params->periodic_advertising_properties =
-        periodic_params.periodic_advertising_properties;
+    parsePeriodicParams(p_periodic_params, periodic_params);
 
     do_in_bta_thread(
         FROM_HERE,
@@ -203,7 +185,46 @@
              std::move(advertise_data), std::move(scan_response_data),
              base::Owned(p_periodic_params), std::move(periodic_data),
              timeout_s, jni_thread_wrapper(FROM_HERE, timeout_cb)));
-  };
+  }
+
+  void SetPeriodicAdvertisingParameters(
+      int advertiser_id, PeriodicAdvertisingParameters periodic_params,
+      StatusCallback cb) override {
+    VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id;
+
+    tBLE_PERIODIC_ADV_PARAMS* p_periodic_params = new tBLE_PERIODIC_ADV_PARAMS;
+    parsePeriodicParams(p_periodic_params, periodic_params);
+
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetPeriodicAdvertisingParameters,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             base::Owned(p_periodic_params),
+             jni_thread_wrapper(FROM_HERE, cb)));
+  }
+
+  void SetPeriodicAdvertisingData(int advertiser_id, std::vector<uint8_t> data,
+                                  StatusCallback cb) override {
+    VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id;
+
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetPeriodicAdvertisingData,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             std::move(data), jni_thread_wrapper(FROM_HERE, cb)));
+  }
+
+  void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable,
+                                    StatusCallback cb) override {
+    VLOG(1) << __func__ << " advertiser_id: " << +advertiser_id
+            << " ,enable: " << enable;
+
+    do_in_bta_thread(
+        FROM_HERE,
+        Bind(&BleAdvertisingManager::SetPeriodicAdvertisingEnable,
+             base::Unretained(BleAdvertisingManager::Get()), advertiser_id,
+             enable, jni_thread_wrapper(FROM_HERE, cb)));
+  }
 };
 
 BleAdvertiserInterface* btLeAdvertiserInstance = nullptr;
diff --git a/service/test/low_energy_advertiser_unittest.cc b/service/test/low_energy_advertiser_unittest.cc
index eb2211c..d7b0632 100644
--- a/service/test/low_energy_advertiser_unittest.cc
+++ b/service/test/low_energy_advertiser_unittest.cc
@@ -47,31 +47,27 @@
 
   MOCK_METHOD1(RegisterAdvertiser, void(IdStatusCallback));
   MOCK_METHOD1(Unregister, void(uint8_t));
-  MOCK_METHOD10(SetParameters,
-                void(uint8_t advertiser_id,
-                     uint16_t advertising_event_properties,
-                     uint32_t min_interval, uint32_t max_interval, int chnl_map,
-                     int tx_power, uint8_t primary_advertising_phy,
-                     uint8_t secondary_advertising_phy,
-                     uint8_t scan_request_notification_enable,
-                     StatusCallback cb));
-  MOCK_METHOD4(SetData, void(int advertiser_id, bool set_scan_rsp,
-                             std::vector<uint8_t> data, StatusCallback cb));
+  MOCK_METHOD3(SetParameters,
+               void(uint8_t, AdvertiseParameters, ParametersCallback));
+  MOCK_METHOD4(SetData, void(int, bool, std::vector<uint8_t>, StatusCallback));
   MOCK_METHOD5(Enable,
-               void(uint8_t advertiser_id, bool enable, StatusCallback cb,
-                    int timeout_s, StatusCallback timeout_cb));
+               void(uint8_t, bool, StatusCallback, int, StatusCallback));
   MOCK_METHOD7(StartAdvertising,
                void(uint8_t advertiser_id, StatusCallback cb,
                     AdvertiseParameters, std::vector<uint8_t>,
                     std::vector<uint8_t>, int, StatusCallback));
-
   MOCK_METHOD8(StartAdvertisingSet,
-               void(IdStatusCallback cb, AdvertiseParameters params,
+               void(IdTxPowerStatusCallback cb, AdvertiseParameters params,
                     std::vector<uint8_t> advertise_data,
                     std::vector<uint8_t> scan_response_data,
                     PeriodicAdvertisingParameters periodic_params,
                     std::vector<uint8_t> periodic_data, int timeout_s,
                     IdStatusCallback timeout_cb));
+  MOCK_METHOD3(SetPeriodicAdvertisingParameters,
+               void(int, PeriodicAdvertisingParameters, StatusCallback));
+  MOCK_METHOD3(SetPeriodicAdvertisingData,
+               void(int, std::vector<uint8_t>, StatusCallback));
+  MOCK_METHOD3(SetPeriodicAdvertisingEnable, void(int, bool, StatusCallback));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(MockAdvertiserHandler);
diff --git a/stack/btm/ble_advertiser_hci_interface.cc b/stack/btm/ble_advertiser_hci_interface.cc
index c527278..886770e 100644
--- a/stack/btm/ble_advertiser_hci_interface.cc
+++ b/stack/btm/ble_advertiser_hci_interface.cc
@@ -72,6 +72,23 @@
   command_complete.Run(status);
 }
 
+void parameters_response_parser(BleAdvertiserHciInterface::parameters_cb cb,
+                                uint8_t* ret_params, uint16_t ret_params_len) {
+  uint8_t status;
+  int8_t tx_power;
+
+  uint8_t* pp = ret_params;
+  STREAM_TO_UINT8(status, pp);
+  STREAM_TO_INT8(tx_power, pp);
+
+  cb.Run(status, tx_power);
+}
+
+void known_tx_pwr(BleAdvertiserHciInterface::parameters_cb cb, int8_t tx_power,
+                  uint8_t status) {
+  cb.Run(status, tx_power);
+}
+
 class BleAdvertiserVscHciInterfaceImpl : public BleAdvertiserHciInterface {
   void SendAdvCmd(const tracked_objects::Location& posted_from,
                   uint8_t param_len, uint8_t* param_buf,
@@ -100,7 +117,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb command_complete) override {
+                     parameters_cb command_complete) override {
     VLOG(1) << __func__;
     uint8_t param[BTM_BLE_MULTI_ADV_SET_PARAM_LEN];
     memset(param, 0, BTM_BLE_MULTI_ADV_SET_PARAM_LEN);
@@ -119,7 +136,7 @@
     } else {
       LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex
                  << properties;
-      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT);
+      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0);
       return;
     }
 
@@ -132,8 +149,9 @@
     UINT8_TO_STREAM(pp, handle);
     INT8_TO_STREAM(pp, tx_power);
 
-    SendAdvCmd(FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param,
-               command_complete);
+    SendAdvCmd(
+        FROM_HERE, BTM_BLE_MULTI_ADV_SET_PARAM_LEN, param,
+        base::Bind(&known_tx_pwr, std::move(command_complete), tx_power));
   }
 
   void SetAdvertisingData(uint8_t handle, uint8_t operation,
@@ -224,14 +242,9 @@
   bool QuirkAdvertiserZeroHandle() override {
     // Android BT HCI Requirements version 0.96 and below specify that handle 0
     // is equal to standard HCI interface, and should be accessed using non-VSC
-    // commands. Broadcom controllers are strict about this requirement, so
-    // don't use 0 handle.
-    if (BTM_IS_BRCM_CONTROLLER()) {
-      LOG(INFO) << "QuirkAdvertiserZeroHandle in use";
-      return true;
-    }
-
-    return false;
+    // commands.
+    LOG(INFO) << "QuirkAdvertiserZeroHandle in use";
+    return true;
   }
 
   void RemoveAdvertisingSet(uint8_t handle,
@@ -302,7 +315,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb command_complete) override {
+                     parameters_cb command_complete) override {
     VLOG(1) << __func__;
 
     uint8_t param[HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS];
@@ -320,7 +333,7 @@
     } else {
       LOG(ERROR) << "Unsupported advertisement type selected:" << std::hex
                  << properties;
-      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT);
+      command_complete.Run(HCI_ERR_ILLEGAL_PARAMETER_FMT, 0);
       return;
     }
 
@@ -330,8 +343,10 @@
     UINT8_TO_STREAM(pp, channel_map);
     UINT8_TO_STREAM(pp, filter_policy);
 
-    SendAdvCmd(FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param,
-               HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS, command_complete);
+    SendAdvCmd(
+        FROM_HERE, HCI_BLE_WRITE_ADV_PARAMS, param,
+        HCIC_PARAM_SIZE_BLE_WRITE_ADV_PARAMS,
+        base::Bind(&known_tx_pwr, std::move(command_complete), (int8_t)0));
   }
 
   void SetAdvertisingData(uint8_t handle, uint8_t operation,
@@ -446,7 +461,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb command_complete) override {
+                     parameters_cb command_complete) override {
     VLOG(1) << __func__;
     const uint16_t HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN = 25;
     uint8_t param[HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN];
@@ -469,8 +484,10 @@
     UINT8_TO_STREAM(pp, advertising_sid);
     UINT8_TO_STREAM(pp, scan_request_notify_enable);
 
-    SendAdvCmd(FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param,
-               HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN, command_complete);
+    btu_hcif_send_cmd_with_cb(
+        FROM_HERE, HCI_LE_SET_EXT_ADVERTISING_PARAM, param,
+        HCI_LE_SET_EXT_ADVERTISING_PARAM_LEN,
+        base::Bind(parameters_response_parser, std::move(command_complete)));
   }
 
   void SetAdvertisingData(uint8_t handle, uint8_t operation,
diff --git a/stack/btm/ble_advertiser_hci_interface.h b/stack/btm/ble_advertiser_hci_interface.h
index 5a9fd4f..7797ce8 100644
--- a/stack/btm/ble_advertiser_hci_interface.h
+++ b/stack/btm/ble_advertiser_hci_interface.h
@@ -29,6 +29,8 @@
 class BleAdvertiserHciInterface {
  public:
   using status_cb = base::Callback<void(uint8_t /* status */)>;
+  using parameters_cb =
+      base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
 
   static void Initialize();
   static BleAdvertiserHciInterface* Get();
@@ -57,7 +59,7 @@
                              uint8_t secondary_max_skip, uint8_t secondary_phy,
                              uint8_t advertising_sid,
                              uint8_t scan_request_notify_enable,
-                             status_cb command_complete) = 0;
+                             parameters_cb command_complete) = 0;
   virtual void SetAdvertisingData(uint8_t handle, uint8_t operation,
                                   uint8_t fragment_preference,
                                   uint8_t data_length, uint8_t* data,
diff --git a/stack/btm/btm_ble_multi_adv.cc b/stack/btm/btm_ble_multi_adv.cc
index a733861..f659025 100644
--- a/stack/btm/btm_ble_multi_adv.cc
+++ b/stack/btm/btm_ble_multi_adv.cc
@@ -34,6 +34,8 @@
 using base::Bind;
 using RegisterCb =
     base::Callback<void(uint8_t /* inst_id */, uint8_t /* status */)>;
+using IdTxPowerStatusCb = base::Callback<void(
+    uint8_t /* inst_id */, int8_t /* tx_power */, uint8_t /* status */)>;
 extern void btm_gen_resolvable_private_addr(
     base::Callback<void(uint8_t[8])> cb);
 extern fixed_queue_t* btu_general_alarm_queue;
@@ -113,7 +115,7 @@
 struct CreatorParams {
   uint8_t inst_id;
   BleAdvertisingManagerImpl* self;
-  RegisterCb cb;
+  IdTxPowerStatusCb cb;
   tBTM_BLE_ADV_PARAMS params;
   std::vector<uint8_t> advertise_data;
   std::vector<uint8_t> scan_response_data;
@@ -271,13 +273,15 @@
     // asynchronous flow
     // clang-format off
     c->self->SetParameters(c->inst_id, &c->params, Bind(
-      [](c_type c, uint8_t status) {
+      [](c_type c, uint8_t status, int8_t tx_power) {
         if (status != 0) {
           LOG(ERROR) << "setting parameters failed, status: " << +status;
           c->cb.Run(status);
           return;
         }
 
+        c->self->adv_inst[c->inst_id].tx_power = tx_power;
+
         BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address;
         c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind(
           [](c_type c, uint8_t status) {
@@ -312,7 +316,7 @@
     // clang-format on
   }
 
-  void StartAdvertisingSet(RegisterCb cb, tBTM_BLE_ADV_PARAMS* params,
+  void StartAdvertisingSet(IdTxPowerStatusCb cb, tBTM_BLE_ADV_PARAMS* params,
                            std::vector<uint8_t> advertise_data,
                            std::vector<uint8_t> scan_response_data,
                            tBLE_PERIODIC_ADV_PARAMS* periodic_params,
@@ -339,23 +343,22 @@
       [](c_type c, uint8_t advertiser_id, uint8_t status) {
         if (status != 0) {
           LOG(ERROR) << "registering advertiser failed, status: " << +status;
-          c->cb.Run(0, status);
+          c->cb.Run(0, 0, status);
           return;
         }
 
         c->inst_id = advertiser_id;
 
         c->self->SetParameters(c->inst_id, &c->params, Bind(
-          [](c_type c, uint8_t status) {
+          [](c_type c, uint8_t status, int8_t tx_power) {
             if (status != 0) {
               c->self->Unregister(c->inst_id);
               LOG(ERROR) << "setting parameters failed, status: " << +status;
-              c->cb.Run(0, status);
+              c->cb.Run(0, 0, status);
               return;
             }
 
-            //TODO(jpawlowski): obtain real tx_power from set parameters
-            // response, to put into adv data
+            c->self->adv_inst[c->inst_id].tx_power = tx_power;
 
             BD_ADDR *rpa = &c->self->adv_inst[c->inst_id].own_address;
             c->self->GetHciInterface()->SetRandomAddress(c->inst_id, *rpa, Bind(
@@ -363,7 +366,7 @@
                 if (status != 0) {
                   c->self->Unregister(c->inst_id);
                   LOG(ERROR) << "setting random address failed, status: " << +status;
-                  c->cb.Run(0, status);
+                  c->cb.Run(0, 0, status);
                   return;
                 }
 
@@ -372,7 +375,7 @@
                     if (status != 0) {
                       c->self->Unregister(c->inst_id);
                       LOG(ERROR) << "setting advertise data failed, status: " << +status;
-                      c->cb.Run(0, status);
+                      c->cb.Run(0, 0, status);
                       return;
                     }
 
@@ -381,7 +384,7 @@
                         if (status != 0) {
                           c->self->Unregister(c->inst_id);
                           LOG(ERROR) << "setting scan response data failed, status: " << +status;
-                          c->cb.Run(0, status);
+                          c->cb.Run(0, 0, status);
                           return;
                         }
 
@@ -407,7 +410,7 @@
         if (status != 0) {
           c->self->Unregister(c->inst_id);
           LOG(ERROR) << "setting periodic parameters failed, status: " << +status;
-          c->cb.Run(0, status);
+          c->cb.Run(0, 0, status);
           return;
         }
 
@@ -416,7 +419,7 @@
             if (status != 0) {
               c->self->Unregister(c->inst_id);
               LOG(ERROR) << "setting periodic parameters failed, status: " << +status;
-              c->cb.Run(0, status);
+              c->cb.Run(0, 0, status);
               return;
             }
 
@@ -425,7 +428,7 @@
                 if (status != 0) {
                   c->self->Unregister(c->inst_id);
                   LOG(ERROR) << "enabling periodic advertising failed, status: " << +status;
-                  c->cb.Run(0, status);
+                  c->cb.Run(0, 0, status);
                   return;
                 }
 
@@ -447,10 +450,11 @@
           if (status != 0) {
             c->self->Unregister(c->inst_id);
             LOG(ERROR) << "enabling advertiser failed, status: " << +status;
-            c->cb.Run(0, status);
+            c->cb.Run(0, 0, status);
             return;
           }
-          c->cb.Run(c->inst_id, status);
+          int8_t tx_power = c->self->adv_inst[c->inst_id].tx_power;
+          c->cb.Run(c->inst_id, tx_power, status);
         },
         base::Passed(&c));
 
@@ -460,6 +464,7 @@
 
   void EnableWithTimerCb(uint8_t inst_id, MultiAdvCb enable_cb, int timeout_s,
                          MultiAdvCb timeout_cb, uint8_t status) {
+    VLOG(1) << __func__ << " inst_id: " << +inst_id;
     AdvertisingInstance* p_inst = &adv_inst[inst_id];
 
     // Run the regular enable callback
@@ -487,7 +492,7 @@
     }
 
     AdvertisingInstance* p_inst = &adv_inst[inst_id];
-    VLOG(1) << __func__ << "enable: " << enable;
+    VLOG(1) << __func__ << " enable: " << enable << ", timeout: " << +timeout_s;
     if (!p_inst->in_use) {
       LOG(ERROR) << "Invalid or no active instance";
       cb.Run(BTM_BLE_MULTI_ADV_FAILURE);
@@ -513,7 +518,7 @@
   }
 
   void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params,
-                     MultiAdvCb cb) override {
+                     ParametersCb cb) override {
     VLOG(1) << __func__ << " inst_id: " << +inst_id;
     if (inst_id >= inst_count) {
       LOG(ERROR) << "bad instance id " << +inst_id;
@@ -523,7 +528,7 @@
     AdvertisingInstance* p_inst = &adv_inst[inst_id];
     if (!p_inst->in_use) {
       LOG(ERROR) << "adv instance not in use" << +inst_id;
-      cb.Run(BTM_BLE_MULTI_ADV_FAILURE);
+      cb.Run(BTM_BLE_MULTI_ADV_FAILURE, 0);
       return;
     }
 
diff --git a/stack/include/ble_advertiser.h b/stack/include/ble_advertiser.h
index 3cfae45..30fe6e6 100644
--- a/stack/include/ble_advertiser.h
+++ b/stack/include/ble_advertiser.h
@@ -28,6 +28,8 @@
 #define ADVERTISE_FAILED_TOO_MANY_ADVERTISERS 0x02
 
 using MultiAdvCb = base::Callback<void(uint8_t /* status */)>;
+using ParametersCb =
+    base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
 
 // methods we must have defined
 void btm_ble_update_dmt_flag_bits(uint8_t* flag_value,
@@ -93,7 +95,9 @@
    * enabled.
    */
   virtual void StartAdvertisingSet(
-      base::Callback<void(uint8_t /* inst_id */, uint8_t /* status */)> cb,
+      base::Callback<void(uint8_t /* inst_id */, int8_t /* tx_power */,
+                          uint8_t /* status */)>
+          cb,
       tBTM_BLE_ADV_PARAMS* params, std::vector<uint8_t> advertise_data,
       std::vector<uint8_t> scan_response_data,
       tBLE_PERIODIC_ADV_PARAMS* periodic_params,
@@ -116,7 +120,7 @@
   /* This function update a Multi-ADV instance with the specififed adv
    * parameters. */
   virtual void SetParameters(uint8_t inst_id, tBTM_BLE_ADV_PARAMS* p_params,
-                             MultiAdvCb cb) = 0;
+                             ParametersCb cb) = 0;
 
   /* This function configure a Multi-ADV instance with the specified adv data or
    * scan response data.*/
diff --git a/stack/test/ble_advertiser_test.cc b/stack/test/ble_advertiser_test.cc
index 4977704..8a6a3a7 100644
--- a/stack/test/ble_advertiser_test.cc
+++ b/stack/test/ble_advertiser_test.cc
@@ -30,6 +30,7 @@
 using ::testing::IsEmpty;
 using ::testing::SaveArg;
 using status_cb = BleAdvertiserHciInterface::status_cb;
+using parameters_cb = BleAdvertiserHciInterface::parameters_cb;
 
 const int num_adv_instances = 16;
 
@@ -97,7 +98,7 @@
                void(uint8_t, uint16_t, uint32_t, uint32_t, uint8_t, uint8_t,
                     BD_ADDR, uint8_t, BD_ADDR));
   MOCK_METHOD8(SetParameters2, void(uint8_t, int8_t, uint8_t, uint8_t, uint8_t,
-                                    uint8_t, uint8_t, status_cb));
+                                    uint8_t, uint8_t, parameters_cb));
 
   void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
                      uint32_t adv_int_max, uint8_t channel_map,
@@ -107,7 +108,7 @@
                      uint8_t primary_phy, uint8_t secondary_max_skip,
                      uint8_t secondary_phy, uint8_t advertising_sid,
                      uint8_t scan_request_notify_enable,
-                     status_cb cmd_complete) override {
+                     parameters_cb cmd_complete) override {
     SetParameters1(handle, properties, adv_int_min, adv_int_max, channel_map,
                    own_address_type, own_address, peer_address_type,
                    peer_address);
@@ -160,7 +161,9 @@
     reg_status = status;
   }
 
-  void SetParametersCb(uint8_t status) { set_params_status = status; }
+  void SetParametersCb(uint8_t status, int8_t tx_power) {
+    set_params_status = status;
+  }
   void SetDataCb(uint8_t status) { set_data_status = status; }
   void EnableCb(uint8_t status) { enable_status = status; }
   void StartAdvertisingCb(uint8_t status) { start_advertising_status = status; }
@@ -199,7 +202,7 @@
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
   int advertiser_id = reg_inst_id;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   tBTM_BLE_ADV_PARAMS params;
   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
       .Times(1);
@@ -213,7 +216,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // we are a truly gracious fake controller, let the command succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, 0);
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
 
   status_cb set_data_cb;
@@ -261,7 +264,7 @@
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
   int advertiser_id = reg_inst_id;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   tBTM_BLE_ADV_PARAMS params;
   params.advertising_event_properties =
       BleAdvertisingManager::advertising_prop_legacy_connectable;
@@ -278,7 +281,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // let the set parameters command succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, 0);
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
 
   status_cb set_data_cb;
@@ -311,7 +314,7 @@
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
   int advertiser_id = reg_inst_id;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   tBTM_BLE_ADV_PARAMS params;
   params.advertising_event_properties =
       BleAdvertisingManager::advertising_prop_legacy_non_connectable;
@@ -329,7 +332,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // let the set parameters command succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, -15);
   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
 
   status_cb set_data_cb;
@@ -391,7 +394,7 @@
   std::vector<uint8_t> scan_resp;
   tBTM_BLE_ADV_PARAMS params;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   status_cb set_address_cb;
   status_cb set_data_cb;
   status_cb set_scan_resp_data_cb;
@@ -420,7 +423,7 @@
       &params, adv_data, scan_resp, 0, base::Callback<void(uint8_t)>());
 
   // we are a truly gracious fake controller, let the commands succeed!
-  set_params_cb.Run(0);
+  set_params_cb.Run(0, 0);
   set_address_cb.Run(0);
   set_data_cb.Run(0);
   set_scan_resp_data_cb.Run(0);
@@ -451,7 +454,7 @@
   std::vector<uint8_t> scan_resp;
   tBTM_BLE_ADV_PARAMS params;
 
-  status_cb set_params_cb;
+  parameters_cb set_params_cb;
   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
       .Times(1);
   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
@@ -468,7 +471,7 @@
   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
 
   // set params failed
-  set_params_cb.Run(0x01);
+  set_params_cb.Run(0x01, 0);
 
   // Expect the whole flow to fail right away
   EXPECT_EQ(BTM_BLE_MULTI_ADV_FAILURE, start_advertising_status);
