diff --git a/include/hardware/ble_advertiser.h b/include/hardware/ble_advertiser.h
deleted file mode 100644
index 5284800..0000000
--- a/include/hardware/ble_advertiser.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef ANDROID_INCLUDE_BLE_ADVERTISER_H
-#define ANDROID_INCLUDE_BLE_ADVERTISER_H
-
-#include <base/callback_forward.h>
-#include <stdint.h>
-#include <vector>
-#include "bt_common_types.h"
-#include "bt_gatt_types.h"
-
-struct AdvertiseParameters {
-  uint16_t advertising_event_properties;
-  uint32_t min_interval;
-  uint32_t max_interval;
-  uint8_t channel_map;
-  int8_t tx_power;
-  uint8_t primary_advertising_phy;
-  uint8_t secondary_advertising_phy;
-  uint8_t scan_request_notification_enable;
-};
-
-struct PeriodicAdvertisingParameters {
-  uint8_t enable;
-  uint16_t min_interval;
-  uint16_t max_interval;
-  uint16_t periodic_advertising_properties;
-};
-
-class BleAdvertiserInterface {
- public:
-  virtual ~BleAdvertiserInterface() = default;
-
-  /** Callback invoked when multi-adv operation has completed */
-  using StatusCallback = base::Callback<void(uint8_t /* status */)>;
-  using IdStatusCallback =
-      base::Callback<void(uint8_t /* advertiser_id */, uint8_t /* status */)>;
-  using IdTxPowerStatusCallback =
-      base::Callback<void(uint8_t /* advertiser_id */, int8_t /* tx_power */, uint8_t /* status */)>;
-  using ParametersCallback =
-      base::Callback<void(uint8_t /* status */, int8_t /* tx_power */)>;
-
-  /** Registers an advertiser with the stack */
-  virtual void RegisterAdvertiser(IdStatusCallback) = 0;
-
-  using GetAddressCallback = base::Callback<void(uint8_t /* address_type*/, RawAddress /*address*/)>;
-  virtual void GetOwnAddress(uint8_t advertiser_id, GetAddressCallback cb) = 0;
-
-  /* Set the parameters as per spec, user manual specified values */
-  virtual void SetParameters(uint8_t advertiser_id, AdvertiseParameters params,
-                             ParametersCallback cb) = 0;
-
-  /* Setup the data */
-  virtual void SetData(int advertiser_id, bool set_scan_rsp,
-                       std::vector<uint8_t> data, StatusCallback cb) = 0;
-
-  /* Enable the advertising instance */
-  virtual void Enable(uint8_t advertiser_id, bool enable, StatusCallback cb,
-                      uint16_t duration, uint8_t maxExtAdvEvents,
-                      StatusCallback timeout_cb) = 0;
-
-  /*  Unregisters an advertiser */
-  virtual void Unregister(uint8_t advertiser_id) = 0;
-
-  virtual void StartAdvertising(uint8_t advertiser_id, StatusCallback cb,
-                                AdvertiseParameters params,
-                                std::vector<uint8_t> advertise_data,
-                                std::vector<uint8_t> scan_response_data,
-                                int timeout_s, StatusCallback timeout_cb) = 0;
-
-  /** Start the advertising set. This include registering, setting all
-   * parameters and data, and enabling it. |register_cb| is called when the set
-   * is advertising. |timeout_cb| is called when the timeout_s have passed */
-  virtual void StartAdvertisingSet(
-      IdTxPowerStatusCallback register_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, uint16_t duration,
-      uint8_t maxExtAdvEvents, IdStatusCallback timeout_cb) = 0;
-
-  virtual void SetPeriodicAdvertisingParameters(
-      int advertiser_id, PeriodicAdvertisingParameters parameters,
-      StatusCallback cb) = 0;
-
-  virtual void SetPeriodicAdvertisingData(int advertiser_id,
-                                          std::vector<uint8_t> data,
-                                          StatusCallback cb) = 0;
-
-  virtual void SetPeriodicAdvertisingEnable(int advertiser_id, bool enable,
-                                            StatusCallback cb) = 0;
-};
-
-#endif /* ANDROID_INCLUDE_BLE_ADVERTISER_H */
diff --git a/include/hardware/ble_scanner.h b/include/hardware/ble_scanner.h
deleted file mode 100644
index ddd251a..0000000
--- a/include/hardware/ble_scanner.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef ANDROID_INCLUDE_BLE_SCANNER_H
-#define ANDROID_INCLUDE_BLE_SCANNER_H
-
-#include <stdint.h>
-#include <vector>
-#include "bt_common_types.h"
-#include "bt_gatt_client.h"
-#include "bt_gatt_types.h"
-
-/** Callback invoked when batchscan reports are obtained */
-typedef void (*batchscan_reports_callback)(int client_if, int status,
-                                           int report_format, int num_records,
-                                           std::vector<uint8_t> data);
-
-/** Callback invoked when batchscan storage threshold limit is crossed */
-typedef void (*batchscan_threshold_callback)(int client_if);
-
-/** Track ADV VSE callback invoked when tracked device is found or lost */
-typedef void (*track_adv_event_callback)(
-    btgatt_track_adv_info_t *p_track_adv_info);
-
-/** Callback for scan results */
-typedef void (*scan_result_callback)(uint16_t event_type, uint8_t addr_type,
-                                     RawAddress *bda, uint8_t primary_phy,
-                                     uint8_t secondary_phy,
-                                     uint8_t advertising_sid, int8_t tx_power,
-                                     int8_t rssi, uint16_t periodic_adv_int,
-                                     std::vector<uint8_t> adv_data);
-
-typedef struct {
-  scan_result_callback scan_result_cb;
-  batchscan_reports_callback batchscan_reports_cb;
-  batchscan_threshold_callback batchscan_threshold_cb;
-  track_adv_event_callback track_adv_event_cb;
-} btgatt_scanner_callbacks_t;
-
-class BleScannerInterface {
- public:
-  virtual ~BleScannerInterface() = default;
-
-  using RegisterCallback =
-      base::Callback<void(uint8_t /* scanner_id */, uint8_t /* status */)>;
-
-  using Callback = base::Callback<void(uint8_t /* status */)>;
-
-  using EnableCallback =
-      base::Callback<void(uint8_t /* action */, uint8_t /* status */)>;
-
-  using FilterParamSetupCallback =
-      base::Callback<void(uint8_t /* avbl_space */, uint8_t /* action_type */,
-                          uint8_t /* status */)>;
-
-  using FilterConfigCallback =
-      base::Callback<void(uint8_t /* filt_type */, uint8_t /* avbl_space */,
-                          uint8_t /* action */, uint8_t /* status */)>;
-
-  /** Registers a scanner with the stack */
-  virtual void RegisterScanner(RegisterCallback) = 0;
-
-  /** Unregister a scanner from the stack */
-  virtual void Unregister(int scanner_id) = 0;
-
-  /** Start or stop LE device scanning */
-  virtual void Scan(bool start) = 0;
-
-  /** Setup scan filter params */
-  virtual void ScanFilterParamSetup(
-      uint8_t client_if, uint8_t action, uint8_t filt_index,
-      std::unique_ptr<btgatt_filt_param_setup_t> filt_param,
-      FilterParamSetupCallback cb) = 0;
-
-  /** Configure a scan filter condition  */
-  virtual void ScanFilterAddRemove(int action, int filt_type, int filt_index,
-                                   int company_id, int company_id_mask,
-                                   const bluetooth::Uuid *p_uuid,
-                                   const bluetooth::Uuid *p_uuid_mask,
-                                   const RawAddress *bd_addr, char addr_type,
-                                   std::vector<uint8_t> data,
-                                   std::vector<uint8_t> p_mask,
-                                   FilterConfigCallback cb) = 0;
-
-  /** Clear all scan filter conditions for specific filter index*/
-  virtual void ScanFilterClear(int filt_index, FilterConfigCallback cb) = 0;
-
-  /** Enable / disable scan filter feature*/
-  virtual void ScanFilterEnable(bool enable, EnableCallback cb) = 0;
-
-  /** Sets the LE scan interval and window in units of N*0.625 msec */
-  virtual void SetScanParameters(int scan_interval, int scan_window,
-                                 Callback cb) = 0;
-
-  /* Configure the batchscan storage */
-  virtual void BatchscanConfigStorage(int client_if, int batch_scan_full_max,
-                                      int batch_scan_trunc_max,
-                                      int batch_scan_notify_threshold,
-                                      Callback cb) = 0;
-
-  /* Enable batchscan */
-  virtual void BatchscanEnable(int scan_mode, int scan_interval,
-                               int scan_window, int addr_type, int discard_rule,
-                               Callback cb) = 0;
-
-  /* Disable batchscan */
-  virtual void BatchscanDisable(Callback cb) = 0;
-
-  /* Read out batchscan reports */
-  virtual void BatchscanReadReports(int client_if, int scan_mode) = 0;
-
-  using StartSyncCb =
-      base::Callback<void(uint8_t status, uint16_t sync_handle,
-                          uint8_t advertising_sid, uint8_t address_type,
-                          RawAddress address, uint8_t phy, uint16_t interval)>;
-  using SyncReportCb =
-      base::Callback<void(uint16_t sync_handle, int8_t tx_power, int8_t rssi,
-                          uint8_t status, std::vector<uint8_t> data)>;
-  using SyncLostCb = base::Callback<void(uint16_t sync_handle)>;
-  virtual void StartSync(uint8_t sid, RawAddress address, uint16_t skip,
-                         uint16_t timeout, StartSyncCb start_cb,
-                         SyncReportCb report_cb, SyncLostCb lost_cb) = 0;
-  virtual void StopSync(uint16_t handle) = 0;
-};
-
-#endif /* ANDROID_INCLUDE_BLE_SCANNER_H */
\ No newline at end of file
diff --git a/include/hardware/bt_av.h b/include/hardware/bt_av.h
deleted file mode 100644
index 36722d4..0000000
--- a/include/hardware/bt_av.h
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_AV_H
-#define ANDROID_INCLUDE_BT_AV_H
-
-#include <vector>
-
-#include <hardware/bluetooth.h>
-
-__BEGIN_DECLS
-
-/* Bluetooth AV connection states */
-typedef enum {
-    BTAV_CONNECTION_STATE_DISCONNECTED = 0,
-    BTAV_CONNECTION_STATE_CONNECTING,
-    BTAV_CONNECTION_STATE_CONNECTED,
-    BTAV_CONNECTION_STATE_DISCONNECTING
-} btav_connection_state_t;
-
-/* Bluetooth AV datapath states */
-typedef enum {
-    BTAV_AUDIO_STATE_REMOTE_SUSPEND = 0,
-    BTAV_AUDIO_STATE_STOPPED,
-    BTAV_AUDIO_STATE_STARTED,
-} btav_audio_state_t;
-
-/*
- * Enum values for each A2DP supported codec.
- * There should be a separate entry for each A2DP codec that is supported
- * for encoding (SRC), and for decoding purpose (SINK).
- */
-typedef enum {
-  BTAV_A2DP_CODEC_INDEX_SOURCE_MIN = 0,
-
-  // Add an entry for each source codec here.
-  // NOTE: The values should be same as those listed in the following file:
-  //   BluetoothCodecConfig.java
-  BTAV_A2DP_CODEC_INDEX_SOURCE_SBC = 0,
-  BTAV_A2DP_CODEC_INDEX_SOURCE_AAC,
-  BTAV_A2DP_CODEC_INDEX_SOURCE_APTX,
-  BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD,
-  BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC,
-
-  BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
-
-  BTAV_A2DP_CODEC_INDEX_SINK_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MAX,
-
-  // Add an entry for each sink codec here
-  BTAV_A2DP_CODEC_INDEX_SINK_SBC = BTAV_A2DP_CODEC_INDEX_SINK_MIN,
-
-  BTAV_A2DP_CODEC_INDEX_SINK_MAX,
-
-  BTAV_A2DP_CODEC_INDEX_MIN = BTAV_A2DP_CODEC_INDEX_SOURCE_MIN,
-  BTAV_A2DP_CODEC_INDEX_MAX = BTAV_A2DP_CODEC_INDEX_SINK_MAX
-} btav_a2dp_codec_index_t;
-
-typedef enum {
-  // Disable the codec.
-  // NOTE: This value can be used only during initialization when
-  // function btav_source_interface_t::init() is called.
-  BTAV_A2DP_CODEC_PRIORITY_DISABLED = -1,
-
-  // Reset the codec priority to its default value.
-  BTAV_A2DP_CODEC_PRIORITY_DEFAULT = 0,
-
-  // Highest codec priority.
-  BTAV_A2DP_CODEC_PRIORITY_HIGHEST = 1000 * 1000
-} btav_a2dp_codec_priority_t;
-
-typedef enum {
-  BTAV_A2DP_CODEC_SAMPLE_RATE_NONE   = 0x0,
-  BTAV_A2DP_CODEC_SAMPLE_RATE_44100  = 0x1 << 0,
-  BTAV_A2DP_CODEC_SAMPLE_RATE_48000  = 0x1 << 1,
-  BTAV_A2DP_CODEC_SAMPLE_RATE_88200  = 0x1 << 2,
-  BTAV_A2DP_CODEC_SAMPLE_RATE_96000  = 0x1 << 3,
-  BTAV_A2DP_CODEC_SAMPLE_RATE_176400 = 0x1 << 4,
-  BTAV_A2DP_CODEC_SAMPLE_RATE_192000 = 0x1 << 5
-} btav_a2dp_codec_sample_rate_t;
-
-typedef enum {
-  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE = 0x0,
-  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16   = 0x1 << 0,
-  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24   = 0x1 << 1,
-  BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32   = 0x1 << 2
-} btav_a2dp_codec_bits_per_sample_t;
-
-typedef enum {
-  BTAV_A2DP_CODEC_CHANNEL_MODE_NONE   = 0x0,
-  BTAV_A2DP_CODEC_CHANNEL_MODE_MONO   = 0x1 << 0,
-  BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO = 0x1 << 1
-} btav_a2dp_codec_channel_mode_t;
-
-/*
- * Structure for representing codec capability or configuration.
- * It is used for configuring A2DP codec preference, and for reporting back
- * current configuration or codec capability.
- * For codec capability, fields "sample_rate", "bits_per_sample" and
- * "channel_mode" can contain bit-masks with all supported features.
- */
-typedef struct {
-  btav_a2dp_codec_index_t codec_type;
-  btav_a2dp_codec_priority_t codec_priority; // Codec selection priority
-                                // relative to other codecs: larger value
-                                // means higher priority. If 0, reset to
-                                // default.
-  btav_a2dp_codec_sample_rate_t sample_rate;
-  btav_a2dp_codec_bits_per_sample_t bits_per_sample;
-  btav_a2dp_codec_channel_mode_t channel_mode;
-  int64_t codec_specific_1;     // Codec-specific value 1
-  int64_t codec_specific_2;     // Codec-specific value 2
-  int64_t codec_specific_3;     // Codec-specific value 3
-  int64_t codec_specific_4;     // Codec-specific value 4
-} btav_a2dp_codec_config_t;
-
-/** Callback for connection state change.
- *  state will have one of the values from btav_connection_state_t
- */
-typedef void (* btav_connection_state_callback)(btav_connection_state_t state,
-                                                    RawAddress *bd_addr);
-
-/** Callback for audiopath state change.
- *  state will have one of the values from btav_audio_state_t
- */
-typedef void (* btav_audio_state_callback)(btav_audio_state_t state,
-                                               RawAddress *bd_addr);
-
-/** Callback for audio configuration change.
- *  Used only for the A2DP Source interface.
- */
-typedef void (* btav_audio_source_config_callback)(
-    btav_a2dp_codec_config_t codec_config,
-    std::vector<btav_a2dp_codec_config_t> codecs_local_capabilities,
-    std::vector<btav_a2dp_codec_config_t> codecs_selectable_capabilities);
-
-/** Callback for audio configuration change.
- *  Used only for the A2DP Sink interface.
- *  sample_rate: sample rate in Hz
- *  channel_count: number of channels (1 for mono, 2 for stereo)
- */
-typedef void (* btav_audio_sink_config_callback)(RawAddress *bd_addr,
-                                                 uint32_t sample_rate,
-                                                 uint8_t channel_count);
-
-/** BT-AV A2DP Source callback structure. */
-typedef struct {
-    /** set to sizeof(btav_source_callbacks_t) */
-    size_t      size;
-    btav_connection_state_callback  connection_state_cb;
-    btav_audio_state_callback audio_state_cb;
-    btav_audio_source_config_callback audio_config_cb;
-} btav_source_callbacks_t;
-
-/** BT-AV A2DP Sink callback structure. */
-typedef struct {
-    /** set to sizeof(btav_sink_callbacks_t) */
-    size_t      size;
-    btav_connection_state_callback  connection_state_cb;
-    btav_audio_state_callback audio_state_cb;
-    btav_audio_sink_config_callback audio_config_cb;
-} btav_sink_callbacks_t;
-
-/**
- * NOTE:
- *
- * 1. AVRCP 1.0 shall be supported initially. AVRCP passthrough commands
- *    shall be handled internally via uinput
- *
- * 2. A2DP data path shall be handled via a socket pipe between the AudioFlinger
- *    android_audio_hw library and the Bluetooth stack.
- *
- */
-
-/** Represents the standard BT-AV A2DP Source interface.
- */
-typedef struct {
-
-    /** set to sizeof(btav_source_interface_t) */
-    size_t          size;
-    /**
-     * Register the BtAv callbacks.
-     */
-    bt_status_t (*init)(btav_source_callbacks_t* callbacks,
-                std::vector<btav_a2dp_codec_config_t> codec_priorities);
-
-    /** connect to headset */
-    bt_status_t (*connect)( RawAddress *bd_addr );
-
-    /** dis-connect from headset */
-    bt_status_t (*disconnect)( RawAddress *bd_addr );
-
-    /** configure the codecs settings preferences */
-    bt_status_t (*config_codec)(std::vector<btav_a2dp_codec_config_t> codec_preferences);
-
-    /** Closes the interface. */
-    void  (*cleanup)( void );
-
-} btav_source_interface_t;
-
-/** Represents the standard BT-AV A2DP Sink interface.
- */
-typedef struct {
-
-    /** set to sizeof(btav_sink_interface_t) */
-    size_t          size;
-    /**
-     * Register the BtAv callbacks
-     */
-    bt_status_t (*init)( btav_sink_callbacks_t* callbacks );
-
-    /** connect to headset */
-    bt_status_t (*connect)( RawAddress *bd_addr );
-
-    /** dis-connect from headset */
-    bt_status_t (*disconnect)( RawAddress *bd_addr );
-
-    /** Closes the interface. */
-    void  (*cleanup)( void );
-
-    /** Sends Audio Focus State. */
-    void  (*set_audio_focus_state)( int focus_state );
-
-    /** Sets the audio track gain. */
-    void  (*set_audio_track_gain)( float gain );
-} btav_sink_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_AV_H */
diff --git a/include/hardware/bt_common_types.h b/include/hardware/bt_common_types.h
deleted file mode 100644
index 1deae27..0000000
--- a/include/hardware/bt_common_types.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2015 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 contains constants and definitions that can be used commonly between JNI and stack layer
- *
- ******************************************************************************/
-#ifndef ANDROID_INCLUDE_BT_COMMON_TYPES_H
-#define ANDROID_INCLUDE_BT_COMMON_TYPES_H
-
-#include "bluetooth.h"
-
-#include <bluetooth/uuid.h>
-
-typedef struct
-{
-    uint8_t  client_if;
-    uint8_t  filt_index;
-    uint8_t  advertiser_state;
-    uint8_t  advertiser_info_present;
-    uint8_t  addr_type;
-    uint8_t  tx_power;
-    int8_t  rssi_value;
-    uint16_t time_stamp;
-    RawAddress bd_addr;
-    uint8_t  adv_pkt_len;
-    uint8_t  *p_adv_pkt_data;
-    uint8_t  scan_rsp_len;
-    uint8_t  *p_scan_rsp_data;
-} btgatt_track_adv_info_t;
-
-typedef enum
-{
-    BTGATT_DB_PRIMARY_SERVICE,
-    BTGATT_DB_SECONDARY_SERVICE,
-    BTGATT_DB_INCLUDED_SERVICE,
-    BTGATT_DB_CHARACTERISTIC,
-    BTGATT_DB_DESCRIPTOR,
-} bt_gatt_db_attribute_type_t;
-
-typedef struct
-{
-    uint16_t             id;
-    bluetooth::Uuid      uuid;
-    bt_gatt_db_attribute_type_t type;
-    uint16_t            attribute_handle;
-
-    /*
-     * If |type| is |BTGATT_DB_PRIMARY_SERVICE|, or
-     * |BTGATT_DB_SECONDARY_SERVICE|, this contains the start and end attribute
-     * handles.
-     */
-    uint16_t            start_handle;
-    uint16_t            end_handle;
-
-    /*
-     * If |type| is |BTGATT_DB_CHARACTERISTIC|, this contains the properties of
-     * the characteristic.
-     */
-    uint8_t             properties;
-    uint16_t            permissions;
-} btgatt_db_element_t;
-
-typedef struct
-{
-    uint16_t feat_seln;
-    uint16_t list_logic_type;
-    uint8_t  filt_logic_type;
-    uint8_t  rssi_high_thres;
-    uint8_t  rssi_low_thres;
-    uint8_t  dely_mode;
-    uint16_t found_timeout;
-    uint16_t lost_timeout;
-    uint8_t  found_timeout_cnt;
-    uint16_t  num_of_tracking_entries;
-} btgatt_filt_param_setup_t;
-
-
-#endif  /* ANDROID_INCLUDE_BT_COMMON_TYPES_H */
diff --git a/include/hardware/bt_gatt.h b/include/hardware/bt_gatt.h
deleted file mode 100644
index 393d1a5..0000000
--- a/include/hardware/bt_gatt.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_INCLUDE_BT_GATT_H
-#define ANDROID_INCLUDE_BT_GATT_H
-
-#include <stdint.h>
-#include "ble_advertiser.h"
-#include "ble_scanner.h"
-#include "bt_gatt_client.h"
-#include "bt_gatt_server.h"
-
-__BEGIN_DECLS
-
-/** BT-GATT callbacks */
-typedef struct {
-    /** Set to sizeof(btgatt_callbacks_t) */
-    size_t size;
-
-    /** GATT Client callbacks */
-    const btgatt_client_callbacks_t* client;
-
-    /** GATT Server callbacks */
-    const btgatt_server_callbacks_t* server;
-
-    /** LE scanner callbacks */
-    const btgatt_scanner_callbacks_t* scanner;
-} btgatt_callbacks_t;
-
-/** Represents the standard Bluetooth GATT interface. */
-typedef struct {
-    /** Set to sizeof(btgatt_interface_t) */
-    size_t          size;
-
-    /**
-     * Initializes the interface and provides callback routines
-     */
-    bt_status_t (*init)( const btgatt_callbacks_t* callbacks );
-
-    /** Closes the interface */
-    void (*cleanup)( void );
-
-    /** Pointer to the GATT client interface methods.*/
-    const btgatt_client_interface_t* client;
-
-    /** Pointer to the GATT server interface methods.*/
-    const btgatt_server_interface_t* server;
-
-    /** Pointer to the LE scanner interface methods.*/
-    BleScannerInterface* scanner;
-
-    /** Pointer to the advertiser interface methods.*/
-    BleAdvertiserInterface* advertiser;
-} btgatt_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_GATT_H */
diff --git a/include/hardware/bt_gatt_client.h b/include/hardware/bt_gatt_client.h
deleted file mode 100644
index 1ec9744..0000000
--- a/include/hardware/bt_gatt_client.h
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_INCLUDE_BT_GATT_CLIENT_H
-#define ANDROID_INCLUDE_BT_GATT_CLIENT_H
-
-#include <stdint.h>
-#include <vector>
-#include "bt_gatt_types.h"
-#include "bt_common_types.h"
-
-#include <bluetooth/uuid.h>
-
-__BEGIN_DECLS
-
-/**
- * Buffer sizes for maximum attribute length and maximum read/write
- * operation buffer size.
- */
-#define BTGATT_MAX_ATTR_LEN 600
-
-/** Buffer type for unformatted reads/writes */
-typedef struct
-{
-    uint8_t             value[BTGATT_MAX_ATTR_LEN];
-    uint16_t            len;
-} btgatt_unformatted_value_t;
-
-/** Parameters for GATT read operations */
-typedef struct
-{
-    uint16_t           handle;
-    btgatt_unformatted_value_t value;
-    uint16_t            value_type;
-    uint8_t             status;
-} btgatt_read_params_t;
-
-/** Parameters for GATT write operations */
-typedef struct
-{
-    btgatt_srvc_id_t    srvc_id;
-    btgatt_gatt_id_t    char_id;
-    btgatt_gatt_id_t    descr_id;
-    uint8_t             status;
-} btgatt_write_params_t;
-
-/** Attribute change notification parameters */
-typedef struct
-{
-    uint8_t             value[BTGATT_MAX_ATTR_LEN];
-    RawAddress         bda;
-    uint16_t            handle;
-    uint16_t            len;
-    uint8_t             is_notify;
-} btgatt_notify_params_t;
-
-typedef struct
-{
-    RawAddress        *bda1;
-    bluetooth::Uuid   *uuid1;
-    uint16_t            u1;
-    uint16_t            u2;
-    uint16_t            u3;
-    uint16_t            u4;
-    uint16_t            u5;
-} btgatt_test_params_t;
-
-/* BT GATT client error codes */
-typedef enum
-{
-    BT_GATTC_COMMAND_SUCCESS = 0,    /* 0  Command succeeded                 */
-    BT_GATTC_COMMAND_STARTED,        /* 1  Command started OK.               */
-    BT_GATTC_COMMAND_BUSY,           /* 2  Device busy with another command  */
-    BT_GATTC_COMMAND_STORED,         /* 3 request is stored in control block */
-    BT_GATTC_NO_RESOURCES,           /* 4  No resources to issue command     */
-    BT_GATTC_MODE_UNSUPPORTED,       /* 5  Request for 1 or more unsupported modes */
-    BT_GATTC_ILLEGAL_VALUE,          /* 6  Illegal command /parameter value  */
-    BT_GATTC_INCORRECT_STATE,        /* 7  Device in wrong state for request  */
-    BT_GATTC_UNKNOWN_ADDR,           /* 8  Unknown remote BD address         */
-    BT_GATTC_DEVICE_TIMEOUT,         /* 9  Device timeout                    */
-    BT_GATTC_INVALID_CONTROLLER_OUTPUT,/* 10  An incorrect value was received from HCI */
-    BT_GATTC_SECURITY_ERROR,          /* 11 Authorization or security failure or not authorized  */
-    BT_GATTC_DELAYED_ENCRYPTION_CHECK, /*12 Delayed encryption check */
-    BT_GATTC_ERR_PROCESSING           /* 12 Generic error                     */
-} btgattc_error_t;
-
-/** BT-GATT Client callback structure. */
-
-/** Callback invoked in response to register_client */
-typedef void (*register_client_callback)(int status, int client_if, const bluetooth::Uuid& app_uuid);
-
-/** GATT open callback invoked in response to open */
-typedef void (*connect_callback)(int conn_id, int status, int client_if, const RawAddress& bda);
-
-/** Callback invoked in response to close */
-typedef void (*disconnect_callback)(int conn_id, int status,
-                int client_if, const RawAddress& bda);
-
-/**
- * Invoked in response to search_service when the GATT service search
- * has been completed.
- */
-typedef void (*search_complete_callback)(int conn_id, int status);
-
-/** Callback invoked in response to [de]register_for_notification */
-typedef void (*register_for_notification_callback)(int conn_id,
-                int registered, int status, uint16_t handle);
-
-/**
- * Remote device notification callback, invoked when a remote device sends
- * a notification or indication that a client has registered for.
- */
-typedef void (*notify_callback)(int conn_id, const btgatt_notify_params_t& p_data);
-
-/** Reports result of a GATT read operation */
-typedef void (*read_characteristic_callback)(int conn_id, int status,
-                btgatt_read_params_t *p_data);
-
-/** GATT write characteristic operation callback */
-typedef void (*write_characteristic_callback)(int conn_id, int status, uint16_t handle);
-
-/** GATT execute prepared write callback */
-typedef void (*execute_write_callback)(int conn_id, int status);
-
-/** Callback invoked in response to read_descriptor */
-typedef void (*read_descriptor_callback)(int conn_id, int status,
-                const btgatt_read_params_t& p_data);
-
-/** Callback invoked in response to write_descriptor */
-typedef void (*write_descriptor_callback)(int conn_id, int status, uint16_t handle);
-
-/** Callback triggered in response to read_remote_rssi */
-typedef void (*read_remote_rssi_callback)(int client_if, const RawAddress& bda,
-                                          int rssi, int status);
-
-/** Callback invoked when the MTU for a given connection changes */
-typedef void (*configure_mtu_callback)(int conn_id, int status, int mtu);
-
-
-/**
- * Callback notifying an application that a remote device connection is currently congested
- * and cannot receive any more data. An application should avoid sending more data until
- * a further callback is received indicating the congestion status has been cleared.
- */
-typedef void (*congestion_callback)(int conn_id, bool congested);
-
-/** GATT get database callback */
-typedef void (*get_gatt_db_callback)(int conn_id, const btgatt_db_element_t* db, int count);
-
-/** GATT services between start_handle and end_handle were removed */
-typedef void (*services_removed_callback)(int conn_id, uint16_t start_handle, uint16_t end_handle);
-
-/** GATT services were added */
-typedef void (*services_added_callback)(int conn_id, const btgatt_db_element_t& added, int added_count);
-
-/** Callback invoked when the PHY for a given connection changes */
-typedef void (*phy_updated_callback)(int conn_id, uint8_t tx_phy,
-                                     uint8_t rx_phy, uint8_t status);
-
-/** Callback invoked when the connection parameters for a given connection changes */
-typedef void (*conn_updated_callback)(int conn_id, uint16_t interval,
-                                      uint16_t latency, uint16_t timeout,
-                                      uint8_t status);
-
-typedef struct {
-    register_client_callback            register_client_cb;
-    connect_callback                    open_cb;
-    disconnect_callback                 close_cb;
-    search_complete_callback            search_complete_cb;
-    register_for_notification_callback  register_for_notification_cb;
-    notify_callback                     notify_cb;
-    read_characteristic_callback        read_characteristic_cb;
-    write_characteristic_callback       write_characteristic_cb;
-    read_descriptor_callback            read_descriptor_cb;
-    write_descriptor_callback           write_descriptor_cb;
-    execute_write_callback              execute_write_cb;
-    read_remote_rssi_callback           read_remote_rssi_cb;
-    configure_mtu_callback              configure_mtu_cb;
-    congestion_callback                 congestion_cb;
-    get_gatt_db_callback                get_gatt_db_cb;
-    services_removed_callback           services_removed_cb;
-    services_added_callback             services_added_cb;
-    phy_updated_callback                phy_updated_cb;
-    conn_updated_callback               conn_updated_cb;
-} btgatt_client_callbacks_t;
-
-/** Represents the standard BT-GATT client interface. */
-
-typedef struct {
-    /** Registers a GATT client application with the stack */
-    bt_status_t (*register_client)(const bluetooth::Uuid& uuid);
-
-    /** Unregister a client application from the stack */
-    bt_status_t (*unregister_client)(int client_if);
-
-    /** Create a connection to a remote LE or dual-mode device */
-    bt_status_t (*connect)(int client_if, const RawAddress& bd_addr,
-                           bool is_direct, int transport, bool opportunistic,
-                           int initiating_phys);
-
-    /** Disconnect a remote device or cancel a pending connection */
-    bt_status_t (*disconnect)( int client_if, const RawAddress& bd_addr,
-                    int conn_id);
-
-    /** Clear the attribute cache for a given device */
-    bt_status_t (*refresh)( int client_if, const RawAddress& bd_addr);
-
-    /**
-     * Enumerate all GATT services on a connected device.
-     * Optionally, the results can be filtered for a given UUID.
-     */
-    bt_status_t (*search_service)(int conn_id, const bluetooth::Uuid *filter_uuid);
-
-    /**
-     * Sead "Find service by UUID" request. Used only for PTS tests.
-     */
-    void (*btif_gattc_discover_service_by_uuid)(int conn_id, const bluetooth::Uuid& uuid);
-
-    /** Read a characteristic on a remote device */
-    bt_status_t (*read_characteristic)(int conn_id, uint16_t handle,
-                                       int auth_req);
-
-    /** Read a characteristic on a remote device */
-    bt_status_t (*read_using_characteristic_uuid)(
-        int conn_id, const bluetooth::Uuid& uuid, uint16_t s_handle,
-        uint16_t e_handle, int auth_req);
-
-    /** Write a remote characteristic */
-    bt_status_t (*write_characteristic)(int conn_id, uint16_t handle,
-                    int write_type, int auth_req,
-                    std::vector<uint8_t> value);
-
-    /** Read the descriptor for a given characteristic */
-    bt_status_t (*read_descriptor)(int conn_id, uint16_t handle, int auth_req);
-
-    /** Write a remote descriptor for a given characteristic */
-    bt_status_t (*write_descriptor)( int conn_id, uint16_t handle,
-                                     int auth_req, std::vector<uint8_t> value);
-
-    /** Execute a prepared write operation */
-    bt_status_t (*execute_write)(int conn_id, int execute);
-
-    /**
-     * Register to receive notifications or indications for a given
-     * characteristic
-     */
-    bt_status_t (*register_for_notification)( int client_if,
-                    const RawAddress& bd_addr, uint16_t handle);
-
-    /** Deregister a previous request for notifications/indications */
-    bt_status_t (*deregister_for_notification)( int client_if,
-                    const RawAddress& bd_addr, uint16_t handle);
-
-    /** Request RSSI for a given remote device */
-    bt_status_t (*read_remote_rssi)(int client_if, const RawAddress& bd_addr);
-
-    /** Determine the type of the remote device (LE, BR/EDR, Dual-mode) */
-    int (*get_device_type)(const RawAddress &bd_addr);
-
-    /** Configure the MTU for a given connection */
-    bt_status_t (*configure_mtu)(int conn_id, int mtu);
-
-    /** Request a connection parameter update */
-    bt_status_t (*conn_parameter_update)(const RawAddress& bd_addr, int min_interval,
-                    int max_interval, int latency, int timeout);
-
-    bt_status_t (*set_preferred_phy)(const RawAddress& bd_addr, uint8_t tx_phy,
-                                     uint8_t rx_phy, uint16_t phy_options);
-
-    bt_status_t (*read_phy)(
-        const RawAddress& bd_addr,
-        base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)>
-            cb);
-
-    /** Test mode interface */
-    bt_status_t (*test_command)( int command, const btgatt_test_params_t& params);
-
-    /** Get gatt db content */
-    bt_status_t (*get_gatt_db)( int conn_id);
-
-} btgatt_client_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_GATT_CLIENT_H */
diff --git a/include/hardware/bt_gatt_server.h b/include/hardware/bt_gatt_server.h
deleted file mode 100644
index 0a9cb9f..0000000
--- a/include/hardware/bt_gatt_server.h
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_INCLUDE_BT_GATT_SERVER_H
-#define ANDROID_INCLUDE_BT_GATT_SERVER_H
-
-#include <stdint.h>
-#include <vector>
-
-#include "bt_gatt_types.h"
-
-__BEGIN_DECLS
-
-/** GATT value type used in response to remote read requests */
-typedef struct
-{
-    uint8_t           value[BTGATT_MAX_ATTR_LEN];
-    uint16_t          handle;
-    uint16_t          offset;
-    uint16_t          len;
-    uint8_t           auth_req;
-} btgatt_value_t;
-
-/** GATT remote read request response type */
-typedef union
-{
-    btgatt_value_t attr_value;
-    uint16_t            handle;
-} btgatt_response_t;
-
-/** BT-GATT Server callback structure. */
-
-/** Callback invoked in response to register_server */
-typedef void (*register_server_callback)(int status, int server_if,
-                const bluetooth::Uuid& app_uuid);
-
-/** Callback indicating that a remote device has connected or been disconnected */
-typedef void (*connection_callback)(int conn_id, int server_if, int connected,
-                                    const RawAddress& bda);
-
-/** Callback invoked in response to create_service */
-typedef void (*service_added_callback)(int status, int server_if,
-                                       std::vector<btgatt_db_element_t> service);
-
-/** Callback invoked in response to stop_service */
-typedef void (*service_stopped_callback)(int status, int server_if,
-                                         int srvc_handle);
-
-/** Callback triggered when a service has been deleted */
-typedef void (*service_deleted_callback)(int status, int server_if,
-                                         int srvc_handle);
-
-/**
- * Callback invoked when a remote device has requested to read a characteristic
- * or descriptor. The application must respond by calling send_response
- */
-typedef void (*request_read_callback)(int conn_id, int trans_id, const RawAddress& bda,
-                                      int attr_handle, int offset, bool is_long);
-
-/**
- * Callback invoked when a remote device has requested to write to a
- * characteristic or descriptor.
- */
-typedef void (*request_write_callback)(int conn_id, int trans_id, const RawAddress& bda,
-                                       int attr_handle, int offset, bool need_rsp,
-                                       bool is_prep, std::vector<uint8_t> value);
-
-/** Callback invoked when a previously prepared write is to be executed */
-typedef void (*request_exec_write_callback)(int conn_id, int trans_id,
-                                            const RawAddress& bda, int exec_write);
-
-/**
- * Callback triggered in response to send_response if the remote device
- * sends a confirmation.
- */
-typedef void (*response_confirmation_callback)(int status, int handle);
-
-/**
- * Callback confirming that a notification or indication has been sent
- * to a remote device.
- */
-typedef void (*indication_sent_callback)(int conn_id, int status);
-
-/**
- * Callback notifying an application that a remote device connection is currently congested
- * and cannot receive any more data. An application should avoid sending more data until
- * a further callback is received indicating the congestion status has been cleared.
- */
-typedef void (*congestion_callback)(int conn_id, bool congested);
-
-/** Callback invoked when the MTU for a given connection changes */
-typedef void (*mtu_changed_callback)(int conn_id, int mtu);
-
-/** Callback invoked when the PHY for a given connection changes */
-typedef void (*phy_updated_callback)(int conn_id, uint8_t tx_phy,
-                                     uint8_t rx_phy, uint8_t status);
-
-/** Callback invoked when the connection parameters for a given connection changes */
-typedef void (*conn_updated_callback)(int conn_id, uint16_t interval,
-                                      uint16_t latency, uint16_t timeout,
-                                      uint8_t status);
-typedef struct {
-    register_server_callback        register_server_cb;
-    connection_callback             connection_cb;
-    service_added_callback          service_added_cb;
-    service_stopped_callback        service_stopped_cb;
-    service_deleted_callback        service_deleted_cb;
-    request_read_callback           request_read_characteristic_cb;
-    request_read_callback           request_read_descriptor_cb;
-    request_write_callback          request_write_characteristic_cb;
-    request_write_callback          request_write_descriptor_cb;
-    request_exec_write_callback     request_exec_write_cb;
-    response_confirmation_callback  response_confirmation_cb;
-    indication_sent_callback        indication_sent_cb;
-    congestion_callback             congestion_cb;
-    mtu_changed_callback            mtu_changed_cb;
-    phy_updated_callback            phy_updated_cb;
-    conn_updated_callback           conn_updated_cb;
-} btgatt_server_callbacks_t;
-
-/** Represents the standard BT-GATT server interface. */
-typedef struct {
-    /** Registers a GATT server application with the stack */
-    bt_status_t (*register_server)(const bluetooth::Uuid& uuid);
-
-    /** Unregister a server application from the stack */
-    bt_status_t (*unregister_server)(int server_if );
-
-    /** Create a connection to a remote peripheral */
-    bt_status_t (*connect)(int server_if, const RawAddress& bd_addr,
-                            bool is_direct, int transport);
-
-    /** Disconnect an established connection or cancel a pending one */
-    bt_status_t (*disconnect)(int server_if, const RawAddress& bd_addr,
-                    int conn_id );
-
-    /** Create a new service */
-    bt_status_t (*add_service)(int server_if, std::vector<btgatt_db_element_t> service);
-
-    /** Stops a local service */
-    bt_status_t (*stop_service)(int server_if, int service_handle);
-
-    /** Delete a local service */
-    bt_status_t (*delete_service)(int server_if, int service_handle);
-
-    /** Send value indication to a remote device */
-    bt_status_t (*send_indication)(int server_if, int attribute_handle,
-                                   int conn_id, int confirm,
-                                   std::vector<uint8_t> value);
-
-    /** Send a response to a read/write operation */
-    bt_status_t (*send_response)(int conn_id, int trans_id,
-                                 int status, const btgatt_response_t& response);
-
-    bt_status_t (*set_preferred_phy)(const RawAddress& bd_addr, uint8_t tx_phy,
-                                     uint8_t rx_phy, uint16_t phy_options);
-
-    bt_status_t (*read_phy)(
-        const RawAddress& bd_addr,
-        base::Callback<void(uint8_t tx_phy, uint8_t rx_phy, uint8_t status)>
-            cb);
-
-} btgatt_server_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_GATT_CLIENT_H */
diff --git a/include/hardware/bt_gatt_types.h b/include/hardware/bt_gatt_types.h
deleted file mode 100644
index 7130c17..0000000
--- a/include/hardware/bt_gatt_types.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-
-#ifndef ANDROID_INCLUDE_BT_GATT_TYPES_H
-#define ANDROID_INCLUDE_BT_GATT_TYPES_H
-
-#include <stdint.h>
-#include <stdbool.h>
-
-#include <bluetooth/uuid.h>
-
-__BEGIN_DECLS
-
-/**
- * GATT Service types
- */
-#define BTGATT_SERVICE_TYPE_PRIMARY 0
-#define BTGATT_SERVICE_TYPE_SECONDARY 1
-
-/** GATT ID adding instance id tracking to the UUID */
-typedef struct
-{
-    bluetooth::Uuid     uuid;
-    uint8_t             inst_id;
-} btgatt_gatt_id_t;
-
-/** GATT Service ID also identifies the service type (primary/secondary) */
-typedef struct
-{
-    btgatt_gatt_id_t    id;
-    uint8_t             is_primary;
-} btgatt_srvc_id_t;
-
-/** Preferred physical Transport for GATT connection */
-typedef enum
-{
-    GATT_TRANSPORT_AUTO,
-    GATT_TRANSPORT_BREDR,
-    GATT_TRANSPORT_LE
-} btgatt_transport_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_GATT_TYPES_H */
diff --git a/include/hardware/bt_hd.h b/include/hardware/bt_hd.h
deleted file mode 100644
index c99ab24..0000000
--- a/include/hardware/bt_hd.h
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * 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.
- */
-
-#ifndef ANDROID_INCLUDE_BT_HD_H
-#define ANDROID_INCLUDE_BT_HD_H
-
-#include <stdint.h>
-
-__BEGIN_DECLS
-
-typedef enum
-{
-    BTHD_REPORT_TYPE_OTHER = 0,
-    BTHD_REPORT_TYPE_INPUT,
-    BTHD_REPORT_TYPE_OUTPUT,
-    BTHD_REPORT_TYPE_FEATURE,
-    BTHD_REPORT_TYPE_INTRDATA // special value for reports to be sent on INTR (INPUT is assumed)
-} bthd_report_type_t;
-
-typedef enum
-{
-    BTHD_APP_STATE_NOT_REGISTERED,
-    BTHD_APP_STATE_REGISTERED
-} bthd_application_state_t;
-
-typedef enum
-{
-    BTHD_CONN_STATE_CONNECTED,
-    BTHD_CONN_STATE_CONNECTING,
-    BTHD_CONN_STATE_DISCONNECTED,
-    BTHD_CONN_STATE_DISCONNECTING,
-    BTHD_CONN_STATE_UNKNOWN
-} bthd_connection_state_t;
-
-typedef struct
-{
-    const char      *name;
-    const char      *description;
-    const char      *provider;
-    uint8_t         subclass;
-    uint8_t         *desc_list;
-    int             desc_list_len;
-} bthd_app_param_t;
-
-typedef struct
-{
-    uint8_t  service_type;
-    uint32_t token_rate;
-    uint32_t token_bucket_size;
-    uint32_t peak_bandwidth;
-    uint32_t access_latency;
-    uint32_t delay_variation;
-} bthd_qos_param_t;
-
-typedef void (* bthd_application_state_callback)(RawAddress *bd_addr, bthd_application_state_t state);
-typedef void (* bthd_connection_state_callback)(RawAddress *bd_addr, bthd_connection_state_t state);
-typedef void (* bthd_get_report_callback)(uint8_t type, uint8_t id, uint16_t buffer_size);
-typedef void (* bthd_set_report_callback)(uint8_t type, uint8_t id, uint16_t len, uint8_t *p_data);
-typedef void (* bthd_set_protocol_callback)(uint8_t protocol);
-typedef void (* bthd_intr_data_callback)(uint8_t report_id, uint16_t len, uint8_t *p_data);
-typedef void (* bthd_vc_unplug_callback)(void);
-
-/** BT-HD callbacks */
-typedef struct {
-    size_t      size;
-
-    bthd_application_state_callback application_state_cb;
-    bthd_connection_state_callback  connection_state_cb;
-    bthd_get_report_callback        get_report_cb;
-    bthd_set_report_callback        set_report_cb;
-    bthd_set_protocol_callback      set_protocol_cb;
-    bthd_intr_data_callback         intr_data_cb;
-    bthd_vc_unplug_callback         vc_unplug_cb;
-} bthd_callbacks_t;
-
-/** BT-HD interface */
-typedef struct {
-
-    size_t          size;
-
-    /** init interface and register callbacks */
-    bt_status_t (*init)(bthd_callbacks_t* callbacks);
-
-    /** close interface */
-    void  (*cleanup)(void);
-
-    /** register application */
-    bt_status_t (*register_app)(bthd_app_param_t *app_param, bthd_qos_param_t *in_qos,
-                                            bthd_qos_param_t *out_qos);
-
-    /** unregister application */
-    bt_status_t (*unregister_app)(void);
-
-    /** connects to host with virtual cable */
-    bt_status_t (*connect)(RawAddress *bd_addr);
-
-    /** disconnects from currently connected host */
-    bt_status_t (*disconnect)(void);
-
-    /** send report */
-    bt_status_t (*send_report)(bthd_report_type_t type, uint8_t id, uint16_t len, uint8_t *p_data);
-
-    /** notifies error for invalid SET_REPORT */
-    bt_status_t (*report_error)(uint8_t error);
-
-    /** send Virtual Cable Unplug  */
-    bt_status_t (*virtual_cable_unplug)(void);
-
-} bthd_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_HD_H */
-
diff --git a/include/hardware/bt_hf.h b/include/hardware/bt_hf.h
deleted file mode 100644
index 1f6f6eb..0000000
--- a/include/hardware/bt_hf.h
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_HF_H
-#define ANDROID_INCLUDE_BT_HF_H
-
-__BEGIN_DECLS
-
-/* AT response code - OK/Error */
-typedef enum {
-    BTHF_AT_RESPONSE_ERROR = 0,
-    BTHF_AT_RESPONSE_OK
-} bthf_at_response_t;
-
-typedef enum {
-    BTHF_CONNECTION_STATE_DISCONNECTED = 0,
-    BTHF_CONNECTION_STATE_CONNECTING,
-    BTHF_CONNECTION_STATE_CONNECTED,
-    BTHF_CONNECTION_STATE_SLC_CONNECTED,
-    BTHF_CONNECTION_STATE_DISCONNECTING
-} bthf_connection_state_t;
-
-typedef enum {
-    BTHF_AUDIO_STATE_DISCONNECTED = 0,
-    BTHF_AUDIO_STATE_CONNECTING,
-    BTHF_AUDIO_STATE_CONNECTED,
-    BTHF_AUDIO_STATE_DISCONNECTING
-} bthf_audio_state_t;
-
-typedef enum {
-    BTHF_VR_STATE_STOPPED = 0,
-    BTHF_VR_STATE_STARTED
-} bthf_vr_state_t;
-
-typedef enum {
-    BTHF_VOLUME_TYPE_SPK = 0,
-    BTHF_VOLUME_TYPE_MIC
-} bthf_volume_type_t;
-
-/* Noise Reduction and Echo Cancellation */
-typedef enum
-{
-    BTHF_NREC_STOP,
-    BTHF_NREC_START
-} bthf_nrec_t;
-
-/* WBS codec setting */
-typedef enum
-{
-   BTHF_WBS_NONE,
-   BTHF_WBS_NO,
-   BTHF_WBS_YES
-}bthf_wbs_config_t;
-
-/* CHLD - Call held handling */
-typedef enum
-{
-    BTHF_CHLD_TYPE_RELEASEHELD,              // Terminate all held or set UDUB("busy") to a waiting call
-    BTHF_CHLD_TYPE_RELEASEACTIVE_ACCEPTHELD, // Terminate all active calls and accepts a waiting/held call
-    BTHF_CHLD_TYPE_HOLDACTIVE_ACCEPTHELD,    // Hold all active calls and accepts a waiting/held call
-    BTHF_CHLD_TYPE_ADDHELDTOCONF,            // Add all held calls to a conference
-} bthf_chld_type_t;
-
-
-/* HF Indicators HFP 1.7 */
-typedef enum
-{
-    BTHF_HF_IND_ENHANCED_DRIVER_SAFETY = 1,
-    BTHF_HF_IND_BATTERY_LEVEL_STATUS = 2,
-} bthf_hf_ind_type_t;
-
-typedef enum
-{
-    BTHF_HF_IND_DISABLED = 0,
-    BTHF_HF_IND_ENABLED,
-} bthf_hf_ind_status_t;
-
-/** Callback for connection state change.
- *  state will have one of the values from BtHfConnectionState
- */
-typedef void (* bthf_connection_state_callback)(bthf_connection_state_t state, RawAddress *bd_addr);
-
-/** Callback for audio connection state change.
- *  state will have one of the values from BtHfAudioState
- */
-typedef void (* bthf_audio_state_callback)(bthf_audio_state_t state, RawAddress *bd_addr);
-
-/** Callback for VR connection state change.
- *  state will have one of the values from BtHfVRState
- */
-typedef void (* bthf_vr_cmd_callback)(bthf_vr_state_t state, RawAddress *bd_addr);
-
-/** Callback for answer incoming call (ATA)
- */
-typedef void (* bthf_answer_call_cmd_callback)(RawAddress *bd_addr);
-
-/** Callback for disconnect call (AT+CHUP)
- */
-typedef void (* bthf_hangup_call_cmd_callback)(RawAddress *bd_addr);
-
-/** Callback for disconnect call (AT+CHUP)
- *  type will denote Speaker/Mic gain (BtHfVolumeControl).
- */
-typedef void (* bthf_volume_cmd_callback)(bthf_volume_type_t type, int volume, RawAddress *bd_addr);
-
-/** Callback for dialing an outgoing call
- *  If number is NULL, redial
- */
-typedef void (* bthf_dial_call_cmd_callback)(char *number, RawAddress *bd_addr);
-
-/** Callback for sending DTMF tones
- *  tone contains the dtmf character to be sent
- */
-typedef void (* bthf_dtmf_cmd_callback)(char tone, RawAddress *bd_addr);
-
-/** Callback for enabling/disabling noise reduction/echo cancellation
- *  value will be 1 to enable, 0 to disable
- */
-typedef void (* bthf_nrec_cmd_callback)(bthf_nrec_t nrec, RawAddress *bd_addr);
-
-/** Callback for AT+BCS and event from BAC
- *  WBS enable, WBS disable
- */
-typedef void (* bthf_wbs_callback)(bthf_wbs_config_t wbs, RawAddress *bd_addr);
-
-/** Callback for call hold handling (AT+CHLD)
- *  value will contain the call hold command (0, 1, 2, 3)
- */
-typedef void (* bthf_chld_cmd_callback)(bthf_chld_type_t chld, RawAddress *bd_addr);
-
-/** Callback for CNUM (subscriber number)
- */
-typedef void (* bthf_cnum_cmd_callback)(RawAddress *bd_addr);
-
-/** Callback for indicators (CIND)
- */
-typedef void (* bthf_cind_cmd_callback)(RawAddress *bd_addr);
-
-/** Callback for operator selection (COPS)
- */
-typedef void (* bthf_cops_cmd_callback)(RawAddress *bd_addr);
-
-/** Callback for call list (AT+CLCC)
- */
-typedef void (* bthf_clcc_cmd_callback) (RawAddress *bd_addr);
-
-/** Callback for unknown AT command recd from HF
- *  at_string will contain the unparsed AT string
- */
-typedef void (* bthf_unknown_at_cmd_callback)(char *at_string, RawAddress *bd_addr);
-
-/** Callback for keypressed (HSP) event.
- */
-typedef void (* bthf_key_pressed_cmd_callback)(RawAddress *bd_addr);
-
-/** Callback for BIND. Pass the remote HF Indicators supported.
- */
-typedef void (* bthf_bind_cmd_callback)(char *at_string, RawAddress *bd_addr);
-
-/** Callback for BIEV. Pass the change in the Remote HF indicator values
- */
-typedef void (* bthf_biev_cmd_callback)(bthf_hf_ind_type_t ind_id, int ind_value,
-                                        RawAddress *bd_addr);
-
-/** BT-HF callback structure. */
-typedef struct {
-    /** set to sizeof(BtHfCallbacks) */
-    size_t      size;
-    bthf_connection_state_callback  connection_state_cb;
-    bthf_audio_state_callback       audio_state_cb;
-    bthf_vr_cmd_callback            vr_cmd_cb;
-    bthf_answer_call_cmd_callback   answer_call_cmd_cb;
-    bthf_hangup_call_cmd_callback   hangup_call_cmd_cb;
-    bthf_volume_cmd_callback        volume_cmd_cb;
-    bthf_dial_call_cmd_callback     dial_call_cmd_cb;
-    bthf_dtmf_cmd_callback          dtmf_cmd_cb;
-    bthf_nrec_cmd_callback          nrec_cmd_cb;
-    bthf_wbs_callback               wbs_cb;
-    bthf_chld_cmd_callback          chld_cmd_cb;
-    bthf_cnum_cmd_callback          cnum_cmd_cb;
-    bthf_cind_cmd_callback          cind_cmd_cb;
-    bthf_cops_cmd_callback          cops_cmd_cb;
-    bthf_clcc_cmd_callback          clcc_cmd_cb;
-    bthf_unknown_at_cmd_callback    unknown_at_cmd_cb;
-    bthf_bind_cmd_callback          bind_cb;
-    bthf_biev_cmd_callback          biev_cb;
-    bthf_key_pressed_cmd_callback   key_pressed_cmd_cb;
-} bthf_callbacks_t;
-
-/** Network Status */
-typedef enum
-{
-    BTHF_NETWORK_STATE_NOT_AVAILABLE = 0,
-    BTHF_NETWORK_STATE_AVAILABLE
-} bthf_network_state_t;
-
-/** Service type */
-typedef enum
-{
-    BTHF_SERVICE_TYPE_HOME = 0,
-    BTHF_SERVICE_TYPE_ROAMING
-} bthf_service_type_t;
-
-typedef enum {
-    BTHF_CALL_STATE_ACTIVE = 0,
-    BTHF_CALL_STATE_HELD,
-    BTHF_CALL_STATE_DIALING,
-    BTHF_CALL_STATE_ALERTING,
-    BTHF_CALL_STATE_INCOMING,
-    BTHF_CALL_STATE_WAITING,
-    BTHF_CALL_STATE_IDLE
-} bthf_call_state_t;
-
-typedef enum {
-    BTHF_CALL_DIRECTION_OUTGOING = 0,
-    BTHF_CALL_DIRECTION_INCOMING
-} bthf_call_direction_t;
-
-typedef enum {
-    BTHF_CALL_TYPE_VOICE = 0,
-    BTHF_CALL_TYPE_DATA,
-    BTHF_CALL_TYPE_FAX
-} bthf_call_mode_t;
-
-typedef enum {
-    BTHF_CALL_MPTY_TYPE_SINGLE = 0,
-    BTHF_CALL_MPTY_TYPE_MULTI
-} bthf_call_mpty_type_t;
-
-typedef enum {
-    BTHF_CALL_ADDRTYPE_UNKNOWN = 0x81,
-    BTHF_CALL_ADDRTYPE_INTERNATIONAL = 0x91
-} bthf_call_addrtype_t;
-/** Represents the standard BT-HF interface. */
-typedef struct {
-
-    /** set to sizeof(BtHfInterface) */
-    size_t          size;
-    /**
-     * Register the BtHf callbacks
-     */
-    bt_status_t (*init)( bthf_callbacks_t* callbacks, int max_hf_clients, bool inband_ringing_supported);
-
-    /** connect to headset */
-    bt_status_t (*connect)( RawAddress *bd_addr );
-
-    /** dis-connect from headset */
-    bt_status_t (*disconnect)( RawAddress *bd_addr );
-
-    /** create an audio connection */
-    bt_status_t (*connect_audio)( RawAddress *bd_addr );
-
-    /** close the audio connection */
-    bt_status_t (*disconnect_audio)( RawAddress *bd_addr );
-
-    /** start voice recognition */
-    bt_status_t (*start_voice_recognition)( RawAddress *bd_addr );
-
-    /** stop voice recognition */
-    bt_status_t (*stop_voice_recognition)( RawAddress *bd_addr );
-
-    /** volume control */
-    bt_status_t (*volume_control) (bthf_volume_type_t type, int volume, RawAddress *bd_addr );
-
-    /** Combined device status change notification */
-    bt_status_t (*device_status_notification)(bthf_network_state_t ntk_state, bthf_service_type_t svc_type, int signal,
-                           int batt_chg);
-
-    /** Response for COPS command */
-    bt_status_t (*cops_response)(const char *cops, RawAddress *bd_addr );
-
-    /** Response for CIND command */
-    bt_status_t (*cind_response)(int svc, int num_active, int num_held, bthf_call_state_t call_setup_state,
-                                 int signal, int roam, int batt_chg, RawAddress *bd_addr );
-
-    /** Pre-formatted AT response, typically in response to unknown AT cmd */
-    bt_status_t (*formatted_at_response)(const char *rsp, RawAddress *bd_addr );
-
-    /** ok/error response
-     *  ERROR (0)
-     *  OK    (1)
-     */
-    bt_status_t (*at_response) (bthf_at_response_t response_code, int error_code, RawAddress *bd_addr );
-
-    /** response for CLCC command
-     *  Can be iteratively called for each call index
-     *  Call index of 0 will be treated as NULL termination (Completes response)
-     */
-    bt_status_t (*clcc_response) (int index, bthf_call_direction_t dir,
-                                bthf_call_state_t state, bthf_call_mode_t mode,
-                                bthf_call_mpty_type_t mpty, const char *number,
-                                bthf_call_addrtype_t type, RawAddress *bd_addr );
-
-    /** notify of a call state change
-     *  Each update notifies
-     *    1. Number of active/held/ringing calls
-     *    2. call_state: This denotes the state change that triggered this msg
-     *                   This will take one of the values from BtHfCallState
-     *    3. number & type: valid only for incoming & waiting call
-    */
-    bt_status_t (*phone_state_change) (int num_active, int num_held, bthf_call_state_t call_setup_state,
-                                       const char *number, bthf_call_addrtype_t type);
-
-    /** Closes the interface. */
-    void  (*cleanup)( void );
-
-    /** configuration for the SCO codec */
-    bt_status_t (*configure_wbs)( RawAddress *bd_addr ,bthf_wbs_config_t config );
-
-    /** Response for HF Indicator change (+BIND) */
-    bt_status_t (*bind_response)(bthf_hf_ind_type_t ind_id, bthf_hf_ind_status_t ind_status,
-                                 RawAddress *bd_addr);
-
-    /** Whether we will initiate SCO or not **/
-    bt_status_t (*set_sco_allowed)(bool value);
-} bthf_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_HF_H */
diff --git a/include/hardware/bt_hf_client.h b/include/hardware/bt_hf_client.h
deleted file mode 100644
index 5207296..0000000
--- a/include/hardware/bt_hf_client.h
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * Copyright (C) 2012-2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_HF_CLIENT_H
-#define ANDROID_INCLUDE_BT_HF_CLIENT_H
-
-__BEGIN_DECLS
-
-typedef enum {
-    BTHF_CLIENT_CONNECTION_STATE_DISCONNECTED = 0,
-    BTHF_CLIENT_CONNECTION_STATE_CONNECTING,
-    BTHF_CLIENT_CONNECTION_STATE_CONNECTED,
-    BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED,
-    BTHF_CLIENT_CONNECTION_STATE_DISCONNECTING
-} bthf_client_connection_state_t;
-
-typedef enum {
-    BTHF_CLIENT_AUDIO_STATE_DISCONNECTED = 0,
-    BTHF_CLIENT_AUDIO_STATE_CONNECTING,
-    BTHF_CLIENT_AUDIO_STATE_CONNECTED,
-    BTHF_CLIENT_AUDIO_STATE_CONNECTED_MSBC,
-} bthf_client_audio_state_t;
-
-typedef enum {
-    BTHF_CLIENT_VR_STATE_STOPPED = 0,
-    BTHF_CLIENT_VR_STATE_STARTED
-} bthf_client_vr_state_t;
-
-typedef enum {
-    BTHF_CLIENT_VOLUME_TYPE_SPK = 0,
-    BTHF_CLIENT_VOLUME_TYPE_MIC
-} bthf_client_volume_type_t;
-
-typedef enum
-{
-    BTHF_CLIENT_NETWORK_STATE_NOT_AVAILABLE = 0,
-    BTHF_CLIENT_NETWORK_STATE_AVAILABLE
-} bthf_client_network_state_t;
-
-typedef enum
-{
-    BTHF_CLIENT_SERVICE_TYPE_HOME = 0,
-    BTHF_CLIENT_SERVICE_TYPE_ROAMING
-} bthf_client_service_type_t;
-
-typedef enum {
-    BTHF_CLIENT_CALL_STATE_ACTIVE = 0,
-    BTHF_CLIENT_CALL_STATE_HELD,
-    BTHF_CLIENT_CALL_STATE_DIALING,
-    BTHF_CLIENT_CALL_STATE_ALERTING,
-    BTHF_CLIENT_CALL_STATE_INCOMING,
-    BTHF_CLIENT_CALL_STATE_WAITING,
-    BTHF_CLIENT_CALL_STATE_HELD_BY_RESP_HOLD,
-} bthf_client_call_state_t;
-
-typedef enum {
-    BTHF_CLIENT_CALL_NO_CALLS_IN_PROGRESS = 0,
-    BTHF_CLIENT_CALL_CALLS_IN_PROGRESS
-} bthf_client_call_t;
-
-typedef enum {
-    BTHF_CLIENT_CALLSETUP_NONE = 0,
-    BTHF_CLIENT_CALLSETUP_INCOMING,
-    BTHF_CLIENT_CALLSETUP_OUTGOING,
-    BTHF_CLIENT_CALLSETUP_ALERTING
-
-} bthf_client_callsetup_t;
-
-typedef enum {
-    BTHF_CLIENT_CALLHELD_NONE = 0,
-    BTHF_CLIENT_CALLHELD_HOLD_AND_ACTIVE,
-    BTHF_CLIENT_CALLHELD_HOLD,
-} bthf_client_callheld_t;
-
-typedef enum {
-    BTHF_CLIENT_RESP_AND_HOLD_HELD = 0,
-    BTRH_CLIENT_RESP_AND_HOLD_ACCEPT,
-    BTRH_CLIENT_RESP_AND_HOLD_REJECT,
-} bthf_client_resp_and_hold_t;
-
-typedef enum {
-    BTHF_CLIENT_CALL_DIRECTION_OUTGOING = 0,
-    BTHF_CLIENT_CALL_DIRECTION_INCOMING
-} bthf_client_call_direction_t;
-
-typedef enum {
-    BTHF_CLIENT_CALL_MPTY_TYPE_SINGLE = 0,
-    BTHF_CLIENT_CALL_MPTY_TYPE_MULTI
-} bthf_client_call_mpty_type_t;
-
-typedef enum {
-    BTHF_CLIENT_CMD_COMPLETE_OK = 0,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR_NO_CARRIER,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR_BUSY,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR_NO_ANSWER,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR_DELAYED,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR_BLACKLISTED,
-    BTHF_CLIENT_CMD_COMPLETE_ERROR_CME
-} bthf_client_cmd_complete_t;
-
-typedef enum {
-    BTHF_CLIENT_CALL_ACTION_CHLD_0 = 0,
-    BTHF_CLIENT_CALL_ACTION_CHLD_1,
-    BTHF_CLIENT_CALL_ACTION_CHLD_2,
-    BTHF_CLIENT_CALL_ACTION_CHLD_3,
-    BTHF_CLIENT_CALL_ACTION_CHLD_4,
-    BTHF_CLIENT_CALL_ACTION_CHLD_1x,
-    BTHF_CLIENT_CALL_ACTION_CHLD_2x,
-    BTHF_CLIENT_CALL_ACTION_ATA,
-    BTHF_CLIENT_CALL_ACTION_CHUP,
-    BTHF_CLIENT_CALL_ACTION_BTRH_0,
-    BTHF_CLIENT_CALL_ACTION_BTRH_1,
-    BTHF_CLIENT_CALL_ACTION_BTRH_2,
-} bthf_client_call_action_t;
-
-typedef enum {
-    BTHF_CLIENT_SERVICE_UNKNOWN = 0,
-    BTHF_CLIENT_SERVICE_VOICE,
-    BTHF_CLIENT_SERVICE_FAX
-} bthf_client_subscriber_service_type_t;
-
-typedef enum {
-    BTHF_CLIENT_IN_BAND_RINGTONE_NOT_PROVIDED = 0,
-    BTHF_CLIENT_IN_BAND_RINGTONE_PROVIDED,
-} bthf_client_in_band_ring_state_t;
-
-/* Peer features masks */
-#define BTHF_CLIENT_PEER_FEAT_3WAY   0x00000001  /* Three-way calling */
-#define BTHF_CLIENT_PEER_FEAT_ECNR   0x00000002  /* Echo cancellation and/or noise reduction */
-#define BTHF_CLIENT_PEER_FEAT_VREC   0x00000004  /* Voice recognition */
-#define BTHF_CLIENT_PEER_FEAT_INBAND 0x00000008  /* In-band ring tone */
-#define BTHF_CLIENT_PEER_FEAT_VTAG   0x00000010  /* Attach a phone number to a voice tag */
-#define BTHF_CLIENT_PEER_FEAT_REJECT 0x00000020  /* Ability to reject incoming call */
-#define BTHF_CLIENT_PEER_FEAT_ECS    0x00000040  /* Enhanced Call Status */
-#define BTHF_CLIENT_PEER_FEAT_ECC    0x00000080  /* Enhanced Call Control */
-#define BTHF_CLIENT_PEER_FEAT_EXTERR 0x00000100  /* Extended error codes */
-#define BTHF_CLIENT_PEER_FEAT_CODEC  0x00000200  /* Codec Negotiation */
-
-/* Peer call handling features masks */
-#define BTHF_CLIENT_CHLD_FEAT_REL           0x00000001  /* 0  Release waiting call or held calls */
-#define BTHF_CLIENT_CHLD_FEAT_REL_ACC       0x00000002  /* 1  Release active calls and accept other
-                                                              (waiting or held) cal */
-#define BTHF_CLIENT_CHLD_FEAT_REL_X         0x00000004  /* 1x Release specified active call only */
-#define BTHF_CLIENT_CHLD_FEAT_HOLD_ACC      0x00000008  /* 2  Active calls on hold and accept other
-                                                              (waiting or held) call */
-#define BTHF_CLIENT_CHLD_FEAT_PRIV_X        0x00000010  /* 2x Request private mode with specified
-                                                              call (put the rest on hold) */
-#define BTHF_CLIENT_CHLD_FEAT_MERGE         0x00000020  /* 3  Add held call to multiparty */
-#define BTHF_CLIENT_CHLD_FEAT_MERGE_DETACH  0x00000040  /* 4  Connect two calls and leave
-                                                              (disconnect from) multiparty */
-
-/** Callback for connection state change.
- *  state will have one of the values from BtHfConnectionState
- *  peer/chld_features are valid only for BTHF_CLIENT_CONNECTION_STATE_SLC_CONNECTED state
- */
-typedef void (* bthf_client_connection_state_callback)(const RawAddress *bd_addr,
-                                                       bthf_client_connection_state_t state,
-                                                       unsigned int peer_feat,
-                                                       unsigned int chld_feat);
-
-/** Callback for audio connection state change.
- *  state will have one of the values from BtHfAudioState
- */
-typedef void (* bthf_client_audio_state_callback)(const RawAddress *bd_addr,
-                                                  bthf_client_audio_state_t state);
-
-/** Callback for VR connection state change.
- *  state will have one of the values from BtHfVRState
- */
-typedef void (* bthf_client_vr_cmd_callback)(const RawAddress *bd_addr, bthf_client_vr_state_t state);
-
-/** Callback for network state change
- */
-typedef void (* bthf_client_network_state_callback) (const RawAddress *bd_addr,
-                                                     bthf_client_network_state_t state);
-
-/** Callback for network roaming status change
- */
-typedef void (* bthf_client_network_roaming_callback) (const RawAddress *bd_addr,
-                                                       bthf_client_service_type_t type);
-
-/** Callback for signal strength indication
- */
-typedef void (* bthf_client_network_signal_callback) (const RawAddress *bd_addr,
-                                                      int signal_strength);
-
-/** Callback for battery level indication
- */
-typedef void (* bthf_client_battery_level_callback) (const RawAddress *bd_addr,
-                                                     int battery_level);
-
-/** Callback for current operator name
- */
-typedef void (* bthf_client_current_operator_callback) (const RawAddress *bd_addr,
-                                                        const char *name);
-
-/** Callback for call indicator
- */
-typedef void (* bthf_client_call_callback) (const RawAddress *bd_addr, bthf_client_call_t call);
-
-/** Callback for callsetup indicator
- */
-typedef void (* bthf_client_callsetup_callback) (const RawAddress *bd_addr,
-                                                 bthf_client_callsetup_t callsetup);
-
-/** Callback for callheld indicator
- */
-typedef void (* bthf_client_callheld_callback) (const RawAddress *bd_addr,
-                                                bthf_client_callheld_t callheld);
-
-/** Callback for response and hold
- */
-typedef void (* bthf_client_resp_and_hold_callback) (const RawAddress *bd_addr,
-                                                     bthf_client_resp_and_hold_t resp_and_hold);
-
-/** Callback for Calling Line Identification notification
- *  Will be called only when there is an incoming call and number is provided.
- */
-typedef void (* bthf_client_clip_callback) (const RawAddress *bd_addr, const char *number);
-
-/**
- * Callback for Call Waiting notification
- */
-typedef void (* bthf_client_call_waiting_callback) (const RawAddress *bd_addr, const char *number);
-
-/**
- *  Callback for listing current calls. Can be called multiple time.
- *  If number is unknown NULL is passed.
- */
-typedef void (*bthf_client_current_calls) (const RawAddress *bd_addr, int index,
-                                           bthf_client_call_direction_t dir,
-                                           bthf_client_call_state_t state,
-                                           bthf_client_call_mpty_type_t mpty,
-                                           const char *number);
-
-/** Callback for audio volume change
- */
-typedef void (*bthf_client_volume_change_callback) (const RawAddress *bd_addr,
-                                                    bthf_client_volume_type_t type,
-                                                    int volume);
-
-/** Callback for command complete event
- *  cme is valid only for BTHF_CLIENT_CMD_COMPLETE_ERROR_CME type
- */
-typedef void (*bthf_client_cmd_complete_callback) (const RawAddress *bd_addr,
-                                                   bthf_client_cmd_complete_t type,
-                                                   int cme);
-
-/** Callback for subscriber information
- */
-typedef void (* bthf_client_subscriber_info_callback) (const RawAddress *bd_addr,
-                                                       const char *name,
-                                                       bthf_client_subscriber_service_type_t type);
-
-/** Callback for in-band ring tone settings
- */
-typedef void (* bthf_client_in_band_ring_tone_callback) (const RawAddress *bd_addr,
-                                                         bthf_client_in_band_ring_state_t state);
-
-/**
- * Callback for requested number from AG
- */
-typedef void (* bthf_client_last_voice_tag_number_callback) (const RawAddress *bd_addr,
-                                                             const char *number);
-
-/**
- * Callback for sending ring indication to app
- */
-typedef void (* bthf_client_ring_indication_callback) (const RawAddress *bd_addr);
-
-/** BT-HF callback structure. */
-typedef struct {
-    /** set to sizeof(BtHfClientCallbacks) */
-    size_t      size;
-    bthf_client_connection_state_callback  connection_state_cb;
-    bthf_client_audio_state_callback       audio_state_cb;
-    bthf_client_vr_cmd_callback            vr_cmd_cb;
-    bthf_client_network_state_callback     network_state_cb;
-    bthf_client_network_roaming_callback   network_roaming_cb;
-    bthf_client_network_signal_callback    network_signal_cb;
-    bthf_client_battery_level_callback     battery_level_cb;
-    bthf_client_current_operator_callback  current_operator_cb;
-    bthf_client_call_callback              call_cb;
-    bthf_client_callsetup_callback         callsetup_cb;
-    bthf_client_callheld_callback          callheld_cb;
-    bthf_client_resp_and_hold_callback     resp_and_hold_cb;
-    bthf_client_clip_callback              clip_cb;
-    bthf_client_call_waiting_callback      call_waiting_cb;
-    bthf_client_current_calls              current_calls_cb;
-    bthf_client_volume_change_callback     volume_change_cb;
-    bthf_client_cmd_complete_callback      cmd_complete_cb;
-    bthf_client_subscriber_info_callback   subscriber_info_cb;
-    bthf_client_in_band_ring_tone_callback in_band_ring_tone_cb;
-    bthf_client_last_voice_tag_number_callback last_voice_tag_number_callback;
-    bthf_client_ring_indication_callback   ring_indication_cb;
-} bthf_client_callbacks_t;
-
-/** Represents the standard BT-HF interface. */
-typedef struct {
-
-    /** set to sizeof(BtHfClientInterface) */
-    size_t size;
-    /**
-     * Register the BtHf callbacks
-     */
-    bt_status_t (*init)(bthf_client_callbacks_t* callbacks);
-
-    /** connect to audio gateway */
-    bt_status_t (*connect)(RawAddress *bd_addr);
-
-    /** disconnect from audio gateway */
-    bt_status_t (*disconnect)(const RawAddress *bd_addr);
-
-    /** create an audio connection */
-    bt_status_t (*connect_audio)(const RawAddress *bd_addr);
-
-    /** close the audio connection */
-    bt_status_t (*disconnect_audio)(const RawAddress *bd_addr);
-
-    /** start voice recognition */
-    bt_status_t (*start_voice_recognition)(const RawAddress *bd_addr);
-
-    /** stop voice recognition */
-    bt_status_t (*stop_voice_recognition)(const RawAddress *bd_addr);
-
-    /** volume control */
-    bt_status_t (*volume_control) (const RawAddress *bd_addr,
-                                   bthf_client_volume_type_t type,
-                                   int volume);
-
-    /** place a call with number a number
-     * if number is NULL last called number is called (aka re-dial)*/
-    bt_status_t (*dial) (const RawAddress *bd_addr, const char *number);
-
-    /** place a call with number specified by location (speed dial) */
-    bt_status_t (*dial_memory) (const RawAddress *bd_addr, int location);
-
-    /** perform specified call related action
-     * idx is limited only for enhanced call control related action
-     */
-    bt_status_t (*handle_call_action) (const RawAddress *bd_addr,
-                                       bthf_client_call_action_t action,
-                                       int idx);
-
-    /** query list of current calls */
-    bt_status_t (*query_current_calls) (const RawAddress *bd_addr);
-
-    /** query name of current selected operator */
-    bt_status_t (*query_current_operator_name) (const RawAddress *bd_addr);
-
-    /** Retrieve subscriber information */
-    bt_status_t (*retrieve_subscriber_info) (const RawAddress *bd_addr);
-
-    /** Send DTMF code*/
-    bt_status_t (*send_dtmf) (const RawAddress *bd_addr, char code);
-
-    /** Request a phone number from AG corresponding to last voice tag recorded */
-    bt_status_t (*request_last_voice_tag_number) (const RawAddress *bd_addr);
-
-    /** Closes the interface. */
-    void (*cleanup)(void);
-
-    /** Send AT Command. */
-    bt_status_t (*send_at_cmd) (const RawAddress *bd_addr, int cmd, int val1, int val2, const char *arg);
-} bthf_client_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_HF_CLIENT_H */
diff --git a/include/hardware/bt_hh.h b/include/hardware/bt_hh.h
deleted file mode 100644
index c39e3e5..0000000
--- a/include/hardware/bt_hh.h
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_HH_H
-#define ANDROID_INCLUDE_BT_HH_H
-
-#include <stdint.h>
-
-__BEGIN_DECLS
-
-#define BTHH_MAX_DSC_LEN   884
-
-/* HH connection states */
-typedef enum
-{
-    BTHH_CONN_STATE_CONNECTED              = 0,
-    BTHH_CONN_STATE_CONNECTING,
-    BTHH_CONN_STATE_DISCONNECTED,
-    BTHH_CONN_STATE_DISCONNECTING,
-    BTHH_CONN_STATE_FAILED_MOUSE_FROM_HOST,
-    BTHH_CONN_STATE_FAILED_KBD_FROM_HOST,
-    BTHH_CONN_STATE_FAILED_TOO_MANY_DEVICES,
-    BTHH_CONN_STATE_FAILED_NO_BTHID_DRIVER,
-    BTHH_CONN_STATE_FAILED_GENERIC,
-    BTHH_CONN_STATE_UNKNOWN
-} bthh_connection_state_t;
-
-typedef enum
-{
-    BTHH_OK                = 0,
-    BTHH_HS_HID_NOT_READY,        /* handshake error : device not ready */
-    BTHH_HS_INVALID_RPT_ID,       /* handshake error : invalid report ID */
-    BTHH_HS_TRANS_NOT_SPT,        /* handshake error : transaction not spt */
-    BTHH_HS_INVALID_PARAM,        /* handshake error : invalid paremter */
-    BTHH_HS_ERROR,                /* handshake error : unspecified HS error */
-    BTHH_ERR,                     /* general BTA HH error */
-    BTHH_ERR_SDP,                 /* SDP error */
-    BTHH_ERR_PROTO,               /* SET_Protocol error,
-                                                                only used in BTA_HH_OPEN_EVT callback */
-    BTHH_ERR_DB_FULL,             /* device database full error, used  */
-    BTHH_ERR_TOD_UNSPT,           /* type of device not supported */
-    BTHH_ERR_NO_RES,              /* out of system resources */
-    BTHH_ERR_AUTH_FAILED,         /* authentication fail */
-    BTHH_ERR_HDL
-}bthh_status_t;
-
-/* Protocol modes */
-typedef enum {
-    BTHH_REPORT_MODE       = 0x00,
-    BTHH_BOOT_MODE         = 0x01,
-    BTHH_UNSUPPORTED_MODE  = 0xff
-}bthh_protocol_mode_t;
-
-/* Report types */
-typedef enum {
-    BTHH_INPUT_REPORT      = 1,
-    BTHH_OUTPUT_REPORT,
-    BTHH_FEATURE_REPORT
-}bthh_report_type_t;
-
-typedef struct
-{
-    int         attr_mask;
-    uint8_t     sub_class;
-    uint8_t     app_id;
-    int         vendor_id;
-    int         product_id;
-    int         version;
-    uint8_t     ctry_code;
-    int         dl_len;
-    uint8_t     dsc_list[BTHH_MAX_DSC_LEN];
-} bthh_hid_info_t;
-
-/** Callback for connection state change.
- *  state will have one of the values from bthh_connection_state_t
- */
-typedef void (* bthh_connection_state_callback)(RawAddress *bd_addr, bthh_connection_state_t state);
-
-/** Callback for vitual unplug api.
- *  the status of the vitual unplug
- */
-typedef void (* bthh_virtual_unplug_callback)(RawAddress *bd_addr, bthh_status_t hh_status);
-
-/** Callback for get hid info
- *  hid_info will contain attr_mask, sub_class, app_id, vendor_id, product_id, version, ctry_code, len
- */
-typedef void (* bthh_hid_info_callback)(RawAddress *bd_addr, bthh_hid_info_t hid_info);
-
-/** Callback for get protocol api.
- *  the protocol mode is one of the value from bthh_protocol_mode_t
- */
-typedef void (* bthh_protocol_mode_callback)(RawAddress *bd_addr, bthh_status_t hh_status, bthh_protocol_mode_t mode);
-
-/** Callback for get/set_idle_time api.
- */
-typedef void (* bthh_idle_time_callback)(RawAddress *bd_addr, bthh_status_t hh_status, int idle_rate);
-
-
-/** Callback for get report api.
- *  if staus is ok rpt_data contains the report data
- */
-typedef void (* bthh_get_report_callback)(RawAddress *bd_addr, bthh_status_t hh_status, uint8_t* rpt_data, int rpt_size);
-
-/** Callback for set_report/set_protocol api and if error
- *  occurs for get_report/get_protocol api.
- */
-typedef void (* bthh_handshake_callback)(RawAddress *bd_addr, bthh_status_t hh_status);
-
-
-/** BT-HH callback structure. */
-typedef struct {
-    /** set to sizeof(BtHfCallbacks) */
-    size_t      size;
-    bthh_connection_state_callback  connection_state_cb;
-    bthh_hid_info_callback          hid_info_cb;
-    bthh_protocol_mode_callback     protocol_mode_cb;
-    bthh_idle_time_callback         idle_time_cb;
-    bthh_get_report_callback        get_report_cb;
-    bthh_virtual_unplug_callback    virtual_unplug_cb;
-    bthh_handshake_callback         handshake_cb;
-
-} bthh_callbacks_t;
-
-
-
-/** Represents the standard BT-HH interface. */
-typedef struct {
-
-    /** set to sizeof(BtHhInterface) */
-    size_t          size;
-
-    /**
-     * Register the BtHh callbacks
-     */
-    bt_status_t (*init)( bthh_callbacks_t* callbacks );
-
-    /** connect to hid device */
-    bt_status_t (*connect)( RawAddress *bd_addr);
-
-    /** dis-connect from hid device */
-    bt_status_t (*disconnect)( RawAddress *bd_addr );
-
-    /** Virtual UnPlug (VUP) the specified HID device */
-    bt_status_t (*virtual_unplug)(RawAddress *bd_addr);
-
-    /** Set the HID device descriptor for the specified HID device. */
-    bt_status_t (*set_info)(RawAddress *bd_addr, bthh_hid_info_t hid_info );
-
-    /** Get the HID proto mode. */
-    bt_status_t (*get_protocol) (RawAddress *bd_addr, bthh_protocol_mode_t protocolMode);
-
-    /** Set the HID proto mode. */
-    bt_status_t (*set_protocol)(RawAddress *bd_addr, bthh_protocol_mode_t protocolMode);
-
-    /** Get the HID Idle Time */
-    bt_status_t (*get_idle_time)(RawAddress *bd_addr);
-
-    /** Set the HID Idle Time */
-    bt_status_t (*set_idle_time)(RawAddress *bd_addr, uint8_t idleTime);
-
-    /** Send a GET_REPORT to HID device. */
-    bt_status_t (*get_report)(RawAddress *bd_addr, bthh_report_type_t reportType, uint8_t reportId, int bufferSize);
-
-    /** Send a SET_REPORT to HID device. */
-    bt_status_t (*set_report)(RawAddress *bd_addr, bthh_report_type_t reportType, char* report);
-
-    /** Send data to HID device. */
-    bt_status_t (*send_data)(RawAddress *bd_addr, char* data);
-
-    /** Closes the interface. */
-    void  (*cleanup)( void );
-
-} bthh_interface_t;
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_HH_H */
-
-
diff --git a/include/hardware/bt_hl.h b/include/hardware/bt_hl.h
deleted file mode 100644
index 6d909fb..0000000
--- a/include/hardware/bt_hl.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_HL_H
-#define ANDROID_INCLUDE_BT_HL_H
-
-__BEGIN_DECLS
-
-/* HL connection states */
-
-typedef enum
-{
-    BTHL_MDEP_ROLE_SOURCE,
-    BTHL_MDEP_ROLE_SINK
-} bthl_mdep_role_t;
-
-typedef enum {
-    BTHL_APP_REG_STATE_REG_SUCCESS,
-    BTHL_APP_REG_STATE_REG_FAILED,
-    BTHL_APP_REG_STATE_DEREG_SUCCESS,
-    BTHL_APP_REG_STATE_DEREG_FAILED
-} bthl_app_reg_state_t;
-
-typedef enum
-{
-    BTHL_CHANNEL_TYPE_RELIABLE,
-    BTHL_CHANNEL_TYPE_STREAMING,
-    BTHL_CHANNEL_TYPE_ANY
-} bthl_channel_type_t;
-
-
-/* HL connection states */
-typedef enum {
-    BTHL_CONN_STATE_CONNECTING,
-    BTHL_CONN_STATE_CONNECTED,
-    BTHL_CONN_STATE_DISCONNECTING,
-    BTHL_CONN_STATE_DISCONNECTED,
-    BTHL_CONN_STATE_DESTROYED
-} bthl_channel_state_t;
-
-typedef struct
-{
-    bthl_mdep_role_t        mdep_role;
-    int                     data_type;
-    bthl_channel_type_t     channel_type;
-    const char                   *mdep_description; /* MDEP description to be used in the SDP (optional); null terminated */
-} bthl_mdep_cfg_t;
-
-typedef struct
-{
-    const char      *application_name;
-    const char      *provider_name;   /* provider name to be used in the SDP (optional); null terminated */
-    const char      *srv_name;        /* service name to be used in the SDP (optional); null terminated*/
-    const char      *srv_desp;        /* service description to be used in the SDP (optional); null terminated */
-    int             number_of_mdeps;
-    bthl_mdep_cfg_t *mdep_cfg;  /* Dynamic array */
-} bthl_reg_param_t;
-
-/** Callback for application registration status.
- *  state will have one of the values from  bthl_app_reg_state_t
- */
-typedef void (* bthl_app_reg_state_callback)(int app_id, bthl_app_reg_state_t state);
-
-/** Callback for channel connection state change.
- *  state will have one of the values from
- *  bthl_connection_state_t and fd (file descriptor)
- */
-typedef void (* bthl_channel_state_callback)(int app_id, RawAddress *bd_addr, int mdep_cfg_index, int channel_id, bthl_channel_state_t state, int fd);
-
-/** BT-HL callback structure. */
-typedef struct {
-    /** set to sizeof(bthl_callbacks_t) */
-    size_t      size;
-    bthl_app_reg_state_callback     app_reg_state_cb;
-    bthl_channel_state_callback     channel_state_cb;
-} bthl_callbacks_t;
-
-
-/** Represents the standard BT-HL interface. */
-typedef struct {
-
-    /** set to sizeof(bthl_interface_t)  */
-    size_t          size;
-
-    /**
-     * Register the Bthl callbacks
-     */
-    bt_status_t (*init)( bthl_callbacks_t* callbacks );
-
-    /** Register HL application */
-    bt_status_t (*register_application) ( bthl_reg_param_t *p_reg_param, int *app_id);
-
-    /** Unregister HL application */
-    bt_status_t (*unregister_application) (int app_id);
-
-    /** connect channel */
-    bt_status_t (*connect_channel)(int app_id, RawAddress *bd_addr, int mdep_cfg_index, int *channel_id);
-
-    /** destroy channel */
-    bt_status_t (*destroy_channel)(int channel_id);
-
-    /** Close the  Bthl callback **/
-    void (*cleanup)(void);
-
-} bthl_interface_t;
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_HL_H */
-
-
diff --git a/include/hardware/bt_mce.h b/include/hardware/bt_mce.h
deleted file mode 100644
index 406a26a..0000000
--- a/include/hardware/bt_mce.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_MCE_H
-#define ANDROID_INCLUDE_BT_MCE_H
-
-__BEGIN_DECLS
-
-/** MAS instance description */
-typedef struct
-{
-    int  id;
-    int  scn;
-    int  msg_types;
-    char *p_name;
-} btmce_mas_instance_t;
-
-/** callback for get_remote_mas_instances */
-typedef void (*btmce_remote_mas_instances_callback)(bt_status_t status, RawAddress *bd_addr,
-                                                    int num_instances, btmce_mas_instance_t *instances);
-
-typedef struct {
-    /** set to sizeof(btmce_callbacks_t) */
-    size_t      size;
-    btmce_remote_mas_instances_callback  remote_mas_instances_cb;
-} btmce_callbacks_t;
-
-typedef struct {
-    /** set to size of this struct */
-    size_t size;
-
-    /** register BT MCE callbacks */
-    bt_status_t (*init)(btmce_callbacks_t *callbacks);
-
-    /** search for MAS instances on remote device */
-    bt_status_t (*get_remote_mas_instances)(RawAddress *bd_addr);
-} btmce_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_MCE_H */
diff --git a/include/hardware/bt_pan.h b/include/hardware/bt_pan.h
deleted file mode 100644
index 2f2e2e5..0000000
--- a/include/hardware/bt_pan.h
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_PAN_H
-#define ANDROID_INCLUDE_BT_PAN_H
-
-__BEGIN_DECLS
-
-#define BTPAN_ROLE_NONE      0
-#define BTPAN_ROLE_PANNAP    1
-#define BTPAN_ROLE_PANU      2
-
-typedef enum {
-    BTPAN_STATE_CONNECTED       = 0,
-    BTPAN_STATE_CONNECTING      = 1,
-    BTPAN_STATE_DISCONNECTED    = 2,
-    BTPAN_STATE_DISCONNECTING   = 3
-} btpan_connection_state_t;
-
-typedef enum {
-    BTPAN_STATE_ENABLED = 0,
-    BTPAN_STATE_DISABLED = 1
-} btpan_control_state_t;
-
-/**
-* Callback for pan connection state
-*/
-typedef void (*btpan_connection_state_callback)(btpan_connection_state_t state, bt_status_t error,
-                                                const RawAddress *bd_addr, int local_role, int remote_role);
-typedef void (*btpan_control_state_callback)(btpan_control_state_t state, int local_role,
-                                            bt_status_t error, const char* ifname);
-
-typedef struct {
-    size_t size;
-    btpan_control_state_callback control_state_cb;
-    btpan_connection_state_callback connection_state_cb;
-} btpan_callbacks_t;
-typedef struct {
-    /** set to size of this struct*/
-    size_t          size;
-    /**
-     * Initialize the pan interface and register the btpan callbacks
-     */
-    bt_status_t (*init)(const btpan_callbacks_t* callbacks);
-    /*
-     * enable the pan service by specified role. The result state of
-     * enabl will be returned by btpan_control_state_callback. when pan-nap is enabled,
-     * the state of connecting panu device will be notified by btpan_connection_state_callback
-     */
-    bt_status_t (*enable)(int local_role);
-    /*
-     * get current pan local role
-     */
-    int (*get_local_role)(void);
-    /**
-     * start bluetooth pan connection to the remote device by specified pan role. The result state will be
-     * returned by btpan_connection_state_callback
-     */
-    bt_status_t (*connect)(const RawAddress *bd_addr, int local_role, int remote_role);
-    /**
-     * stop bluetooth pan connection. The result state will be returned by btpan_connection_state_callback
-     */
-    bt_status_t (*disconnect)(const RawAddress *bd_addr);
-
-    /**
-     * Cleanup the pan interface
-     */
-    void (*cleanup)(void);
-
-} btpan_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_PAN_H */
diff --git a/include/hardware/bt_rc.h b/include/hardware/bt_rc.h
deleted file mode 100644
index 93fb32f..0000000
--- a/include/hardware/bt_rc.h
+++ /dev/null
@@ -1,649 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef ANDROID_INCLUDE_BT_RC_H
-#define ANDROID_INCLUDE_BT_RC_H
-
-__BEGIN_DECLS
-
-/* Change this macro to use multiple RC */
-#define BT_RC_NUM_APP 1
-
-/* Macros */
-#define BTRC_MAX_ATTR_STR_LEN       (1 << 16)
-#define BTRC_UID_SIZE               8
-#define BTRC_MAX_APP_SETTINGS       8
-#define BTRC_MAX_FOLDER_DEPTH       4
-#define BTRC_MAX_APP_ATTR_SIZE      16
-#define BTRC_MAX_ELEM_ATTR_SIZE     8
-#define BTRC_FEATURE_BIT_MASK_SIZE 16
-
-/* Macros for valid scopes in get_folder_items */
-#define BTRC_SCOPE_PLAYER_LIST  0x00 /* Media Player List */
-#define BTRC_SCOPE_FILE_SYSTEM  0x01 /* Virtual File System */
-#define BTRC_SCOPE_SEARCH  0x02 /* Search */
-#define BTRC_SCOPE_NOW_PLAYING   0x03 /* Now Playing */
-
-/* Macros for supported character encoding */
-#define BTRC_CHARSET_ID_UTF8  0x006A
-
-/* Macros for item types */
-#define BTRC_ITEM_PLAYER  0x01 /* Media Player */
-#define BTRC_ITEM_FOLDER  0x02 /* Folder */
-#define BTRC_ITEM_MEDIA   0x03 /* Media File */
-
-/* Macros for media attribute IDs */
-#define BTRC_MEDIA_ATTR_ID_INVALID               -1
-#define BTRC_MEDIA_ATTR_ID_TITLE                 0x00000001
-#define BTRC_MEDIA_ATTR_ID_ARTIST                0x00000002
-#define BTRC_MEDIA_ATTR_ID_ALBUM                 0x00000003
-#define BTRC_MEDIA_ATTR_ID_TRACK_NUM             0x00000004
-#define BTRC_MEDIA_ATTR_ID_NUM_TRACKS            0x00000005
-#define BTRC_MEDIA_ATTR_ID_GENRE                 0x00000006
-#define BTRC_MEDIA_ATTR_ID_PLAYING_TIME          0x00000007        /* in miliseconds */
-
-/* Macros for folder types */
-#define BTRC_FOLDER_TYPE_MIXED      0x00
-#define BTRC_FOLDER_TYPE_TITLES     0x01
-#define BTRC_FOLDER_TYPE_ALBUMS     0x02
-#define BTRC_FOLDER_TYPE_ARTISTS    0x03
-#define BTRC_FOLDER_TYPE_GENRES     0x04
-#define BTRC_FOLDER_TYPE_PLAYLISTS  0x05
-#define BTRC_FOLDER_TYPE_YEARS      0x06
-
-/* Macros for media types */
-#define BTRC_MEDIA_TYPE_AUDIO  0x00 /* audio */
-#define BTRC_MEDIA_TYPE_VIDEO  0x01 /* video */
-
-/* Macros for num attributes */
-#define BTRC_NUM_ATTR_NONE 0xFF /* No attributes required */
-#define BTRC_NUM_ATTR_ALL  0X00 /* All attributes required */
-
-#define BTRC_HANDLE_NONE 0xFF
-
-typedef uint8_t btrc_uid_t[BTRC_UID_SIZE];
-
-typedef enum {
-    BTRC_CONNECTION_STATE_DISCONNECTED = 0,
-    BTRC_CONNECTION_STATE_CONNECTED
-} btrc_connection_state_t;
-
-typedef enum {
-    BTRC_FEAT_NONE = 0x00,    /* AVRCP 1.0 */
-    BTRC_FEAT_METADATA = 0x01,    /* AVRCP 1.3 */
-    BTRC_FEAT_ABSOLUTE_VOLUME = 0x02,    /* Supports TG role and volume sync */
-    BTRC_FEAT_BROWSE = 0x04,    /* AVRCP 1.4 and up, with Browsing support */
-} btrc_remote_features_t;
-
-typedef enum {
-    BTRC_PLAYSTATE_STOPPED = 0x00,    /* Stopped */
-    BTRC_PLAYSTATE_PLAYING = 0x01,    /* Playing */
-    BTRC_PLAYSTATE_PAUSED = 0x02,    /* Paused  */
-    BTRC_PLAYSTATE_FWD_SEEK = 0x03,    /* Fwd Seek*/
-    BTRC_PLAYSTATE_REV_SEEK = 0x04,    /* Rev Seek*/
-    BTRC_PLAYSTATE_ERROR = 0xFF,    /* Error   */
-} btrc_play_status_t;
-
-typedef enum {
-    BTRC_EVT_PLAY_STATUS_CHANGED = 0x01,
-    BTRC_EVT_TRACK_CHANGE = 0x02,
-    BTRC_EVT_TRACK_REACHED_END = 0x03,
-    BTRC_EVT_TRACK_REACHED_START = 0x04,
-    BTRC_EVT_PLAY_POS_CHANGED = 0x05,
-    BTRC_EVT_APP_SETTINGS_CHANGED = 0x08,
-    BTRC_EVT_NOW_PLAYING_CONTENT_CHANGED = 0x09,
-    BTRC_EVT_AVAL_PLAYER_CHANGE = 0x0a,
-    BTRC_EVT_ADDR_PLAYER_CHANGE = 0x0b,
-    BTRC_EVT_UIDS_CHANGED = 0x0c,
-    BTRC_EVT_VOL_CHANGED = 0x0d,
-} btrc_event_id_t;
-
-typedef enum {
-    BTRC_NOTIFICATION_TYPE_INTERIM = 0,
-    BTRC_NOTIFICATION_TYPE_CHANGED = 1,
-} btrc_notification_type_t;
-
-typedef enum {
-    BTRC_PLAYER_ATTR_EQUALIZER = 0x01,
-    BTRC_PLAYER_ATTR_REPEAT = 0x02,
-    BTRC_PLAYER_ATTR_SHUFFLE = 0x03,
-    BTRC_PLAYER_ATTR_SCAN = 0x04,
-} btrc_player_attr_t;
-
-typedef enum {
-    BTRC_MEDIA_ATTR_TITLE = 0x01,
-    BTRC_MEDIA_ATTR_ARTIST = 0x02,
-    BTRC_MEDIA_ATTR_ALBUM = 0x03,
-    BTRC_MEDIA_ATTR_TRACK_NUM = 0x04,
-    BTRC_MEDIA_ATTR_NUM_TRACKS = 0x05,
-    BTRC_MEDIA_ATTR_GENRE = 0x06,
-    BTRC_MEDIA_ATTR_PLAYING_TIME = 0x07,
-} btrc_media_attr_t;
-
-typedef enum {
-    BTRC_PLAYER_VAL_OFF_REPEAT = 0x01,
-    BTRC_PLAYER_VAL_SINGLE_REPEAT = 0x02,
-    BTRC_PLAYER_VAL_ALL_REPEAT = 0x03,
-    BTRC_PLAYER_VAL_GROUP_REPEAT = 0x04
-} btrc_player_repeat_val_t;
-
-typedef enum {
-    BTRC_PLAYER_VAL_OFF_SHUFFLE = 0x01,
-    BTRC_PLAYER_VAL_ALL_SHUFFLE = 0x02,
-    BTRC_PLAYER_VAL_GROUP_SHUFFLE = 0x03
-} btrc_player_shuffle_val_t;
-
-typedef enum {
-    BTRC_STS_BAD_CMD        = 0x00, /* Invalid command */
-    BTRC_STS_BAD_PARAM      = 0x01, /* Invalid parameter */
-    BTRC_STS_NOT_FOUND      = 0x02, /* Specified parameter is wrong or not found */
-    BTRC_STS_INTERNAL_ERR   = 0x03, /* Internal Error */
-    BTRC_STS_NO_ERROR       = 0x04, /* Operation Success */
-    BTRC_STS_UID_CHANGED    = 0x05, /* UIDs changed */
-    BTRC_STS_RESERVED       = 0x06, /* Reserved */
-    BTRC_STS_INV_DIRN       = 0x07, /* Invalid direction */
-    BTRC_STS_INV_DIRECTORY  = 0x08, /* Invalid directory */
-    BTRC_STS_INV_ITEM       = 0x09, /* Invalid Item */
-    BTRC_STS_INV_SCOPE      = 0x0a, /* Invalid scope */
-    BTRC_STS_INV_RANGE      = 0x0b, /* Invalid range */
-    BTRC_STS_DIRECTORY      = 0x0c, /* UID is a directory */
-    BTRC_STS_MEDIA_IN_USE   = 0x0d, /* Media in use */
-    BTRC_STS_PLAY_LIST_FULL = 0x0e, /* Playing list full */
-    BTRC_STS_SRCH_NOT_SPRTD = 0x0f, /* Search not supported */
-    BTRC_STS_SRCH_IN_PROG   = 0x10, /* Search in progress */
-    BTRC_STS_INV_PLAYER     = 0x11, /* Invalid player */
-    BTRC_STS_PLAY_NOT_BROW  = 0x12, /* Player not browsable */
-    BTRC_STS_PLAY_NOT_ADDR  = 0x13, /* Player not addressed */
-    BTRC_STS_INV_RESULTS    = 0x14, /* Invalid results */
-    BTRC_STS_NO_AVBL_PLAY   = 0x15, /* No available players */
-    BTRC_STS_ADDR_PLAY_CHGD = 0x16, /* Addressed player changed */
-} btrc_status_t;
-
-typedef struct {
-    uint16_t player_id;
-    uint16_t uid_counter;
-} btrc_addr_player_changed_t;
-
-typedef struct {
-    uint8_t num_attr;
-    uint8_t attr_ids[BTRC_MAX_APP_SETTINGS];
-    uint8_t attr_values[BTRC_MAX_APP_SETTINGS];
-} btrc_player_settings_t;
-
-typedef struct {
-    uint8_t   val;
-    uint16_t  charset_id;
-    uint16_t  str_len;
-    uint8_t   *p_str;
-} btrc_player_app_ext_attr_val_t;
-
-typedef struct {
-    uint8_t   attr_id;
-    uint16_t  charset_id;
-    uint16_t  str_len;
-    uint8_t   *p_str;
-    uint8_t   num_val;
-    btrc_player_app_ext_attr_val_t ext_attr_val[BTRC_MAX_APP_ATTR_SIZE];
-} btrc_player_app_ext_attr_t;
-
-typedef struct {
-    uint8_t attr_id;
-    uint8_t num_val;
-    uint8_t attr_val[BTRC_MAX_APP_ATTR_SIZE];
-} btrc_player_app_attr_t;
-
-typedef struct {
-    uint32_t start_item;
-    uint32_t end_item;
-    uint32_t size;
-    uint32_t attrs[BTRC_MAX_ELEM_ATTR_SIZE];
-    uint8_t  attr_count;
-} btrc_getfolderitem_t;
-
-typedef struct {
-    uint16_t type;
-    uint16_t uid_counter;
-} btrc_uids_changed_t;
-
-typedef struct {
-    uint16_t type;
-} btrc_now_playing_changed_t;
-
-typedef union
-{
-    btrc_play_status_t play_status;
-    btrc_uid_t track; /* queue position in NowPlaying */
-    uint32_t song_pos;
-    uint16_t uid_counter;
-    btrc_player_settings_t player_setting;
-    btrc_addr_player_changed_t addr_player_changed;
-    btrc_uids_changed_t uids_changed;
-    btrc_now_playing_changed_t now_playing_changed;
-} btrc_register_notification_t;
-
-typedef struct {
-    uint8_t id; /* can be attr_id or value_id */
-    uint8_t text[BTRC_MAX_ATTR_STR_LEN];
-} btrc_player_setting_text_t;
-
-typedef struct {
-    uint32_t attr_id;
-    uint8_t text[BTRC_MAX_ATTR_STR_LEN];
-} btrc_element_attr_val_t;
-
-typedef struct {
-    uint16_t  player_id;
-    uint8_t   major_type;
-    uint32_t  sub_type;
-    uint8_t   play_status;
-    uint8_t   features[BTRC_FEATURE_BIT_MASK_SIZE];
-    uint16_t  charset_id;
-    uint8_t   name[BTRC_MAX_ATTR_STR_LEN];
-} btrc_item_player_t;
-
-typedef struct {
-    uint8_t   uid[BTRC_UID_SIZE];
-    uint8_t   type;
-    uint8_t   playable;
-    uint16_t  charset_id;
-    uint8_t   name[BTRC_MAX_ATTR_STR_LEN];
-} btrc_item_folder_t;
-
-typedef struct {
-    uint8_t  uid[BTRC_UID_SIZE];
-    uint8_t  type;
-    uint16_t charset_id;
-    uint8_t  name[BTRC_MAX_ATTR_STR_LEN];
-    int      num_attrs;
-    btrc_element_attr_val_t* p_attrs;
-} btrc_item_media_t;
-
-typedef struct {
-    uint8_t item_type;
-    union
-    {
-        btrc_item_player_t player;
-        btrc_item_folder_t folder;
-        btrc_item_media_t  media;
-    };
-} btrc_folder_items_t;
-
-typedef struct {
-    uint16_t  str_len;
-    uint8_t   p_str[BTRC_MAX_ATTR_STR_LEN];
-} btrc_br_folder_name_t;
-
-/** Callback for the controller's supported feautres */
-typedef void (* btrc_remote_features_callback)(RawAddress *bd_addr,
-                                                      btrc_remote_features_t features);
-
-/** Callback for play status request */
-typedef void (* btrc_get_play_status_callback)(RawAddress *bd_addr);
-
-/** Callback for list player application attributes (Shuffle, Repeat,...) */
-typedef void (* btrc_list_player_app_attr_callback)(RawAddress *bd_addr);
-
-/** Callback for list player application attributes (Shuffle, Repeat,...) */
-typedef void (* btrc_list_player_app_values_callback)(btrc_player_attr_t attr_id,
-    RawAddress *bd_addr);
-
-/** Callback for getting the current player application settings value
-**  num_attr: specifies the number of attribute ids contained in p_attrs
-*/
-typedef void (* btrc_get_player_app_value_callback) (uint8_t num_attr,
-    btrc_player_attr_t *p_attrs, RawAddress *bd_addr);
-
-/** Callback for getting the player application settings attributes' text
-**  num_attr: specifies the number of attribute ids contained in p_attrs
-*/
-typedef void (* btrc_get_player_app_attrs_text_callback) (uint8_t num_attr,
-    btrc_player_attr_t *p_attrs, RawAddress *bd_addr);
-
-/** Callback for getting the player application settings values' text
-**  num_attr: specifies the number of value ids contained in p_vals
-*/
-typedef void (* btrc_get_player_app_values_text_callback) (uint8_t attr_id, uint8_t num_val,
-    uint8_t *p_vals, RawAddress *bd_addr);
-
-/** Callback for setting the player application settings values */
-typedef void (* btrc_set_player_app_value_callback) (btrc_player_settings_t *p_vals,
-    RawAddress *bd_addr);
-
-/** Callback to fetch the get element attributes of the current song
-**  num_attr: specifies the number of attributes requested in p_attrs
-*/
-typedef void (* btrc_get_element_attr_callback) (uint8_t num_attr, btrc_media_attr_t *p_attrs,
-    RawAddress *bd_addr);
-
-/** Callback for register notification (Play state change/track change/...)
-**  param: Is only valid if event_id is BTRC_EVT_PLAY_POS_CHANGED
-*/
-typedef void (* btrc_register_notification_callback) (btrc_event_id_t event_id, uint32_t param,
-    RawAddress *bd_addr);
-
-/* AVRCP 1.4 Enhancements */
-/** Callback for volume change on CT
-**  volume: Current volume setting on the CT (0-127)
-*/
-typedef void (* btrc_volume_change_callback) (uint8_t volume, uint8_t ctype, RawAddress *bd_addr);
-
-/** Callback for passthrough commands */
-typedef void (* btrc_passthrough_cmd_callback) (int id, int key_state, RawAddress *bd_addr);
-
-/** Callback for set addressed player response on TG **/
-typedef void (* btrc_set_addressed_player_callback) (uint16_t player_id, RawAddress *bd_addr);
-
-/** Callback for set browsed player response on TG **/
-typedef void (* btrc_set_browsed_player_callback) (uint16_t player_id, RawAddress *bd_addr);
-
-/** Callback for get folder items on TG
-**  num_attr: specifies the number of attributes requested in p_attr_ids
-*/
-typedef void (* btrc_get_folder_items_callback) (uint8_t scope, uint32_t start_item,
-              uint32_t end_item, uint8_t num_attr, uint32_t *p_attr_ids, RawAddress *bd_addr);
-
-/** Callback for changing browsed path on TG **/
-typedef void (* btrc_change_path_callback) (uint8_t direction,
-                uint8_t* folder_uid, RawAddress *bd_addr);
-
-/** Callback to fetch the get item attributes of the media item
-**  num_attr: specifies the number of attributes requested in p_attrs
-*/
-typedef void (* btrc_get_item_attr_callback) (uint8_t scope, uint8_t* uid, uint16_t uid_counter,
-                uint8_t num_attr, btrc_media_attr_t *p_attrs, RawAddress *bd_addr);
-
-/** Callback for play request for the media item indicated by an identifier */
-typedef void (* btrc_play_item_callback) (uint8_t scope,
-                uint16_t uid_counter, uint8_t* uid, RawAddress *bd_addr);
-
-/** Callback to fetch total number of items from a folder **/
-typedef void (* btrc_get_total_num_of_items_callback) (uint8_t scope, RawAddress *bd_addr);
-
-/** Callback for conducting recursive search on a current browsed path for a specified string */
-typedef void (* btrc_search_callback) (uint16_t charset_id,
-                uint16_t str_len, uint8_t* p_str, RawAddress *bd_addr);
-
-/** Callback to add a specified media item indicated by an identifier to now playing queue. */
-typedef void (* btrc_add_to_now_playing_callback) (uint8_t scope,
-                uint8_t* uid, uint16_t  uid_counter, RawAddress *bd_addr);
-
-/** BT-RC Target callback structure. */
-typedef struct {
-    /** set to sizeof(BtRcCallbacks) */
-    size_t      size;
-    btrc_remote_features_callback               remote_features_cb;
-    btrc_get_play_status_callback               get_play_status_cb;
-    btrc_list_player_app_attr_callback          list_player_app_attr_cb;
-    btrc_list_player_app_values_callback        list_player_app_values_cb;
-    btrc_get_player_app_value_callback          get_player_app_value_cb;
-    btrc_get_player_app_attrs_text_callback     get_player_app_attrs_text_cb;
-    btrc_get_player_app_values_text_callback    get_player_app_values_text_cb;
-    btrc_set_player_app_value_callback          set_player_app_value_cb;
-    btrc_get_element_attr_callback              get_element_attr_cb;
-    btrc_register_notification_callback         register_notification_cb;
-    btrc_volume_change_callback                 volume_change_cb;
-    btrc_passthrough_cmd_callback               passthrough_cmd_cb;
-    btrc_set_addressed_player_callback          set_addressed_player_cb;
-    btrc_set_browsed_player_callback            set_browsed_player_cb;
-    btrc_get_folder_items_callback              get_folder_items_cb;
-    btrc_change_path_callback                   change_path_cb;
-    btrc_get_item_attr_callback                 get_item_attr_cb;
-    btrc_play_item_callback                     play_item_cb;
-    btrc_get_total_num_of_items_callback        get_total_num_of_items_cb;
-    btrc_search_callback                        search_cb;
-    btrc_add_to_now_playing_callback            add_to_now_playing_cb;
-} btrc_callbacks_t;
-
-/** Represents the standard BT-RC AVRCP Target interface. */
-typedef struct {
-
-    /** set to sizeof(BtRcInterface) */
-    size_t          size;
-    /**
-     * Register the BtRc callbacks
-     */
-    bt_status_t (*init)( btrc_callbacks_t* callbacks );
-
-    /** Respose to GetPlayStatus request. Contains the current
-    **  1. Play status
-    **  2. Song duration/length
-    **  3. Song position
-    */
-    bt_status_t (*get_play_status_rsp)( RawAddress *bd_addr, btrc_play_status_t play_status,
-        uint32_t song_len, uint32_t song_pos);
-
-    /** Lists the support player application attributes (Shuffle/Repeat/...)
-    **  num_attr: Specifies the number of attributes contained in the pointer p_attrs
-    */
-    bt_status_t (*list_player_app_attr_rsp)( RawAddress *bd_addr, int num_attr,
-        btrc_player_attr_t *p_attrs);
-
-    /** Lists the support player application attributes (Shuffle Off/On/Group)
-    **  num_val: Specifies the number of values contained in the pointer p_vals
-    */
-    bt_status_t (*list_player_app_value_rsp)( RawAddress *bd_addr, int num_val, uint8_t *p_vals);
-
-    /** Returns the current application attribute values for each of the specified attr_id */
-    bt_status_t (*get_player_app_value_rsp)( RawAddress *bd_addr, btrc_player_settings_t *p_vals);
-
-    /** Returns the application attributes text ("Shuffle"/"Repeat"/...)
-    **  num_attr: Specifies the number of attributes' text contained in the pointer p_attrs
-    */
-    bt_status_t (*get_player_app_attr_text_rsp)( RawAddress *bd_addr, int num_attr,
-        btrc_player_setting_text_t *p_attrs);
-
-    /** Returns the application attributes text ("Shuffle"/"Repeat"/...)
-    **  num_attr: Specifies the number of attribute values' text contained in the pointer p_vals
-    */
-    bt_status_t (*get_player_app_value_text_rsp)( RawAddress *bd_addr, int num_val,
-        btrc_player_setting_text_t *p_vals);
-
-    /** Returns the current songs' element attributes text ("Title"/"Album"/"Artist")
-    **  num_attr: Specifies the number of attributes' text contained in the pointer p_attrs
-    */
-    bt_status_t (*get_element_attr_rsp)( RawAddress *bd_addr, uint8_t num_attr,
-        btrc_element_attr_val_t *p_attrs);
-
-    /** Response to set player attribute request ("Shuffle"/"Repeat")
-    **  rsp_status: Status of setting the player attributes for the current media player
-    */
-    bt_status_t (*set_player_app_value_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status);
-
-    /* Response to the register notification request (Play state change/track change/...).
-    ** event_id: Refers to the event_id this notification change corresponds too
-    ** type: Response type - interim/changed
-    ** p_params: Based on the event_id, this parameter should be populated
-    */
-    bt_status_t (*register_notification_rsp)(btrc_event_id_t event_id,
-                                             btrc_notification_type_t type,
-                                             btrc_register_notification_t *p_param);
-
-    /* AVRCP 1.4 enhancements */
-
-    /**Send current volume setting to remote side. Support limited to SetAbsoluteVolume
-    ** This can be enhanced to support Relative Volume (AVRCP 1.0).
-    ** With RelateVolume, we will send VOLUME_UP/VOLUME_DOWN opposed to absolute volume level
-    ** volume: Should be in the range 0-127. bit7 is reseved and cannot be set
-    */
-    bt_status_t (*set_volume)(uint8_t volume);
-
-    /* Set addressed player response from TG to CT */
-    bt_status_t (*set_addressed_player_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status);
-
-    /* Set browsed player response from TG to CT */
-    bt_status_t (*set_browsed_player_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status,
-        uint32_t num_items, uint16_t charset_id, uint8_t folder_depth,
-        btrc_br_folder_name_t *p_folders);
-
-    /* Get folder item list response from TG to CT */
-     bt_status_t (*get_folder_items_list_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status,
-        uint16_t uid_counter, uint8_t num_items, btrc_folder_items_t *p_items);
-
-    /* Change path response from TG to CT */
-    bt_status_t (*change_path_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status,
-        uint32_t num_items);
-
-    /** Returns the element's attributes num_attr: Specifies the number of attributes' text
-     * contained in the pointer p_attrs
-     */
-    bt_status_t (*get_item_attr_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status,
-        uint8_t num_attr, btrc_element_attr_val_t *p_attrs);
-
-    /* play media item response from TG to CT */
-    bt_status_t (*play_item_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status);
-
-    /* get total number of items response from TG to CT*/
-    bt_status_t (*get_total_num_of_items_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status,
-        uint32_t uid_counter, uint32_t num_items);
-
-    /* Search VFS response from TG to CT */
-    bt_status_t (*search_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status, uint32_t uid_counter,
-        uint32_t num_items);
-
-    /* add_to_now playing list response from TG to CT */
-    bt_status_t (*add_to_now_playing_rsp)(RawAddress *bd_addr, btrc_status_t rsp_status);
-
-    /** Closes the interface. */
-    void  (*cleanup)( void );
-} btrc_interface_t;
-
-typedef void (* btrc_passthrough_rsp_callback) (RawAddress *bd_addr, int id, int key_state);
-
-typedef void (* btrc_groupnavigation_rsp_callback) (int id, int key_state);
-
-typedef void (* btrc_connection_state_callback) (
-    bool rc_connect, bool bt_connect, RawAddress *bd_addr);
-
-typedef void (* btrc_ctrl_getrcfeatures_callback) (RawAddress *bd_addr, int features);
-
-typedef void (* btrc_ctrl_setabsvol_cmd_callback) (RawAddress *bd_addr, uint8_t abs_vol, uint8_t label);
-
-typedef void (* btrc_ctrl_registernotification_abs_vol_callback) (RawAddress *bd_addr, uint8_t label);
-
-typedef void (* btrc_ctrl_setplayerapplicationsetting_rsp_callback) (RawAddress *bd_addr,
-                                                                          uint8_t accepted);
-
-typedef void (* btrc_ctrl_playerapplicationsetting_callback)(RawAddress *bd_addr,
-                                                                 uint8_t num_attr,
-                                                                 btrc_player_app_attr_t *app_attrs,
-                                                                 uint8_t num_ext_attr,
-                                                                 btrc_player_app_ext_attr_t *ext_attrs);
-
-typedef void (* btrc_ctrl_playerapplicationsetting_changed_callback)(RawAddress *bd_addr,
-                                                                          btrc_player_settings_t *p_vals);
-
-typedef void (* btrc_ctrl_track_changed_callback)(RawAddress *bd_addr, uint8_t num_attr,
-                                                     btrc_element_attr_val_t *p_attrs);
-
-typedef void (* btrc_ctrl_play_position_changed_callback)(RawAddress *bd_addr,
-                                                              uint32_t song_len, uint32_t song_pos);
-
-typedef void (* btrc_ctrl_play_status_changed_callback)(RawAddress *bd_addr,
-                                                            btrc_play_status_t play_status);
-
-typedef void (* btrc_ctrl_get_folder_items_callback )(RawAddress *bd_addr,
-                                                            btrc_status_t status,
-                                                            const btrc_folder_items_t *folder_items,
-                                                            uint8_t count);
-
-typedef void (* btrc_ctrl_change_path_callback)(RawAddress *bd_addr, uint8_t count);
-
-typedef void (* btrc_ctrl_set_browsed_player_callback )(
-    RawAddress *bd_addr, uint8_t num_items, uint8_t depth);
-typedef void (* btrc_ctrl_set_addressed_player_callback)(RawAddress *bd_addr, uint8_t status);
-/** BT-RC Controller callback structure. */
-typedef struct {
-    /** set to sizeof(BtRcCallbacks) */
-    size_t      size;
-    btrc_passthrough_rsp_callback                               passthrough_rsp_cb;
-    btrc_groupnavigation_rsp_callback                           groupnavigation_rsp_cb;
-    btrc_connection_state_callback                              connection_state_cb;
-    btrc_ctrl_getrcfeatures_callback                            getrcfeatures_cb;
-    btrc_ctrl_setplayerapplicationsetting_rsp_callback          setplayerappsetting_rsp_cb;
-    btrc_ctrl_playerapplicationsetting_callback                 playerapplicationsetting_cb;
-    btrc_ctrl_playerapplicationsetting_changed_callback         playerapplicationsetting_changed_cb;
-    btrc_ctrl_setabsvol_cmd_callback                            setabsvol_cmd_cb;
-    btrc_ctrl_registernotification_abs_vol_callback             registernotification_absvol_cb;
-    btrc_ctrl_track_changed_callback                            track_changed_cb;
-    btrc_ctrl_play_position_changed_callback                    play_position_changed_cb;
-    btrc_ctrl_play_status_changed_callback                      play_status_changed_cb;
-    btrc_ctrl_get_folder_items_callback                         get_folder_items_cb;
-    btrc_ctrl_change_path_callback                              change_folder_path_cb;
-    btrc_ctrl_set_browsed_player_callback                       set_browsed_player_cb;
-    btrc_ctrl_set_addressed_player_callback                     set_addressed_player_cb;
-} btrc_ctrl_callbacks_t;
-
-/** Represents the standard BT-RC AVRCP Controller interface. */
-typedef struct {
-
-    /** set to sizeof(BtRcInterface) */
-    size_t          size;
-    /**
-     * Register the BtRc callbacks
-     */
-    bt_status_t (*init)( btrc_ctrl_callbacks_t* callbacks );
-
-    /** send pass through command to target */
-    bt_status_t (*send_pass_through_cmd) (RawAddress *bd_addr, uint8_t key_code,
-            uint8_t key_state );
-
-    /** send group navigation command to target */
-    bt_status_t (*send_group_navigation_cmd) (RawAddress *bd_addr, uint8_t key_code,
-            uint8_t key_state );
-
-    /** send command to set player applicaiton setting attributes to target */
-    bt_status_t (*set_player_app_setting_cmd) (RawAddress *bd_addr, uint8_t num_attrib,
-            uint8_t* attrib_ids, uint8_t* attrib_vals);
-
-    /** send command to play a particular item */
-    bt_status_t (*play_item_cmd) (
-        RawAddress *bd_addr, uint8_t scope, uint8_t *uid, uint16_t uid_counter);
-
-    /** get the playback state */
-    bt_status_t (*get_playback_state_cmd) (RawAddress *bd_addr);
-
-    /** get the now playing list */
-    bt_status_t (*get_now_playing_list_cmd) (RawAddress *bd_addr, uint8_t start, uint8_t items);
-
-    /** get the folder list */
-    bt_status_t (*get_folder_list_cmd) (RawAddress *bd_addr, uint8_t start, uint8_t items);
-
-    /** get the folder list */
-    bt_status_t (*get_player_list_cmd) (RawAddress *bd_addr, uint8_t start, uint8_t items);
-
-    /** get the folder list */
-    bt_status_t (*change_folder_path_cmd) (RawAddress *bd_addr, uint8_t direction, uint8_t * uid);
-
-    /** set browsed player */
-    bt_status_t (*set_browsed_player_cmd) (RawAddress *bd_addr, uint16_t player_id);
-
-    /** set addressed player */
-    bt_status_t (*set_addressed_player_cmd) (RawAddress *bd_addr, uint16_t player_id);
-
-    /** send rsp to set_abs_vol received from target */
-    bt_status_t (*set_volume_rsp) (RawAddress *bd_addr, uint8_t abs_vol, uint8_t label);
-
-    /** send notificaiton rsp for abs vol to target */
-    bt_status_t (*register_abs_vol_rsp) (RawAddress *bd_addr, btrc_notification_type_t rsp_type,
-            uint8_t abs_vol, uint8_t label);
-
-    /** Closes the interface. */
-    void  (*cleanup)( void );
-} btrc_ctrl_interface_t;
-
-__END_DECLS
-
-#endif /* ANDROID_INCLUDE_BT_RC_H */
diff --git a/include/hardware/bt_sdp.h b/include/hardware/bt_sdp.h
deleted file mode 100644
index 7db7139..0000000
--- a/include/hardware/bt_sdp.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-#include "bluetooth.h"
-
-#define SDP_OPP_SUPPORTED_FORMATS_MAX_LENGTH 15
-
-__BEGIN_DECLS
-
-/**
- * These events are handled by the state machine
- */
-typedef enum {
-    SDP_TYPE_RAW,        // Used to carry raw SDP search data for unknown UUIDs
-    SDP_TYPE_MAP_MAS,    // Message Access Profile - Server
-    SDP_TYPE_MAP_MNS,    // Message Access Profile - Client (Notification Server)
-    SDP_TYPE_PBAP_PSE,   // Phone Book Profile - Server
-    SDP_TYPE_PBAP_PCE,   // Phone Book Profile - Client
-    SDP_TYPE_OPP_SERVER, // Object Push Profile
-    SDP_TYPE_SAP_SERVER  // SIM Access Profile
-} bluetooth_sdp_types;
-
-typedef struct _bluetooth_sdp_hdr {
-    bluetooth_sdp_types type;
-    bluetooth::Uuid uuid;
-    uint32_t    service_name_length;
-    char       *service_name;
-    int32_t     rfcomm_channel_number;
-    int32_t     l2cap_psm;
-    int32_t     profile_version;
-} bluetooth_sdp_hdr;
-
-/**
- * Some signals need additional pointers, hence we introduce a
- * generic way to handle these pointers.
- */
-typedef struct _bluetooth_sdp_hdr_overlay {
-    bluetooth_sdp_types type;
-    bluetooth::Uuid uuid;
-    uint32_t    service_name_length;
-    char       *service_name;
-    int32_t     rfcomm_channel_number;
-    int32_t     l2cap_psm;
-    int32_t     profile_version;
-
-    // User pointers, only used for some signals - see bluetooth_sdp_ops_record
-    int         user1_ptr_len;
-    uint8_t    *user1_ptr;
-    int         user2_ptr_len;
-    uint8_t    *user2_ptr;
-} bluetooth_sdp_hdr_overlay;
-
-typedef struct _bluetooth_sdp_mas_record {
-    bluetooth_sdp_hdr_overlay hdr;
-    uint32_t    mas_instance_id;
-    uint32_t    supported_features;
-    uint32_t    supported_message_types;
-} bluetooth_sdp_mas_record;
-
-typedef struct _bluetooth_sdp_mns_record {
-    bluetooth_sdp_hdr_overlay hdr;
-    uint32_t    supported_features;
-} bluetooth_sdp_mns_record;
-
-typedef struct _bluetooth_sdp_pse_record {
-    bluetooth_sdp_hdr_overlay hdr;
-    uint32_t    supported_features;
-    uint32_t    supported_repositories;
-} bluetooth_sdp_pse_record;
-
-typedef struct _bluetooth_sdp_pce_record {
-    bluetooth_sdp_hdr_overlay hdr;
-} bluetooth_sdp_pce_record;
-
-typedef struct _bluetooth_sdp_ops_record {
-    bluetooth_sdp_hdr_overlay hdr;
-    int         supported_formats_list_len;
-    uint8_t     supported_formats_list[SDP_OPP_SUPPORTED_FORMATS_MAX_LENGTH];
-} bluetooth_sdp_ops_record;
-
-typedef struct _bluetooth_sdp_sap_record {
-    bluetooth_sdp_hdr_overlay hdr;
-} bluetooth_sdp_sap_record;
-
-typedef union {
-    bluetooth_sdp_hdr_overlay   hdr;
-    bluetooth_sdp_mas_record    mas;
-    bluetooth_sdp_mns_record    mns;
-    bluetooth_sdp_pse_record    pse;
-    bluetooth_sdp_pce_record    pce;
-    bluetooth_sdp_ops_record    ops;
-    bluetooth_sdp_sap_record    sap;
-} bluetooth_sdp_record;
-
-
-/** Callback for SDP search */
-typedef void (*btsdp_search_callback)(bt_status_t status,
-                                      const RawAddress &bd_addr,
-                                      const bluetooth::Uuid &uuid,
-                                      int num_records,
-                                      bluetooth_sdp_record *records);
-
-typedef struct {
-    /** Set to sizeof(btsdp_callbacks_t) */
-    size_t      size;
-    btsdp_search_callback  sdp_search_cb;
-} btsdp_callbacks_t;
-
-typedef struct {
-    /** Set to size of this struct */
-    size_t size;
-
-    /** Register BT SDP search callbacks */
-    bt_status_t (*init)(btsdp_callbacks_t *callbacks);
-
-    /** Unregister BT SDP */
-    bt_status_t (*deinit)();
-
-    /** Search for SDP records with specific uuid on remote device */
-    bt_status_t (*sdp_search)(RawAddress *bd_addr, const bluetooth::Uuid& uuid);
-
-    /**
-     * Use listen in the socket interface to create rfcomm and/or l2cap PSM channels,
-     * (without UUID and service_name and set the BTSOCK_FLAG_NO_SDP flag in flags).
-     * Then use createSdpRecord to create the SDP record associated with the rfcomm/l2cap channels.
-     *
-     * Returns a handle to the SDP record, which can be parsed to remove_sdp_record.
-     *
-     * record           (in) The SDP record to create
-     * record_handle    (out)The corresponding record handle will be written to this pointer.
-     */
-    bt_status_t (*create_sdp_record)(bluetooth_sdp_record *record, int* record_handle);
-
-    /** Remove a SDP record created by createSdpRecord */
-    bt_status_t (*remove_sdp_record)(int sdp_handle);
-} btsdp_interface_t;
-
-__END_DECLS
-
diff --git a/include/hardware/bt_sock.h b/include/hardware/bt_sock.h
deleted file mode 100644
index 70161a3..0000000
--- a/include/hardware/bt_sock.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#pragma once
-
-__BEGIN_DECLS
-
-#define BTSOCK_FLAG_ENCRYPT 1
-#define BTSOCK_FLAG_AUTH (1 << 1)
-#define BTSOCK_FLAG_NO_SDP (1 << 2)
-#define BTSOCK_FLAG_AUTH_MITM (1 << 3)
-#define BTSOCK_FLAG_AUTH_16_DIGIT (1 << 4)
-
-typedef enum {
-    BTSOCK_RFCOMM = 1,
-    BTSOCK_SCO = 2,
-    BTSOCK_L2CAP = 3
-} btsock_type_t;
-
-/** Represents the standard BT SOCKET interface. */
-typedef struct {
-    short size;
-    RawAddress bd_addr;
-    int channel;
-    int status;
-
-    // The writer must make writes using a buffer of this maximum size
-    // to avoid loosing data. (L2CAP only)
-    unsigned short max_tx_packet_size;
-
-    // The reader must read using a buffer of at least this size to avoid
-    // loosing data. (L2CAP only)
-    unsigned short max_rx_packet_size;
-} __attribute__((packed)) sock_connect_signal_t;
-
-typedef struct {
-    /** set to size of this struct*/
-    size_t          size;
-
-    /**
-     * Listen to a RFCOMM UUID or channel. It returns the socket fd from which
-     * btsock_connect_signal can be read out when a remote device connected.
-     * If neither a UUID nor a channel is provided, a channel will be allocated
-     * and a service record can be created providing the channel number to
-     * create_sdp_record(...) in bt_sdp.
-     * The callingUid is the UID of the application which is requesting the socket. This is
-     * used for traffic accounting purposes.
-     */
-    bt_status_t (*listen)(btsock_type_t type, const char* service_name,
-            const bluetooth::Uuid* service_uuid, int channel, int* sock_fd, int flags, int callingUid);
-
-    /**
-     * Connect to a RFCOMM UUID channel of remote device, It returns the socket fd from which
-     * the btsock_connect_signal and a new socket fd to be accepted can be read out when connected.
-     * The callingUid is the UID of the application which is requesting the socket. This is
-     * used for traffic accounting purposes.
-     */
-    bt_status_t (*connect)(const RawAddress *bd_addr, btsock_type_t type, const bluetooth::Uuid* uuid,
-            int channel, int* sock_fd, int flags, int callingUid);
-} btsock_interface_t;
-
-__END_DECLS
-
